Cet article a fait l’objet d’une traduction automatique. Pour afficher l’article en anglais, activez la case d’option Anglais. Vous pouvez également afficher le texte anglais dans une fenêtre contextuelle en faisant glisser le pointeur de la souris sur le texte traduit.
Traduction
Anglais

Timer.SynchronizingObject propriété

 

Date de publication : novembre 2016

Obtient ou définit l'objet utilisé pour marshaler les appels du gestionnaire d'événements émis quand un intervalle a expiré.

Espace de noms:   System.Timers
Assembly:  System (dans System.dll)

[BrowsableAttribute(false)]
[TimersDescriptionAttribute("TimerSynchronizingObject")]
public ISynchronizeInvoke SynchronizingObject { get; set; }

Valeur de propriété

Type: System.ComponentModel.ISynchronizeInvoke

ISynchronizeInvoke représentant l'objet utilisé pour marshaler les appels du gestionnaire d'événements émis quand un intervalle a expiré. La valeur par défaut est null.

Lorsque SynchronizingObject est null, la méthode qui gère le Elapsed événement est appelé sur un thread du pool de threads système. Pour plus d’informations sur les pools de threads système, consultez ThreadPool.

Lorsque le Elapsed événement est géré par un composant Windows Forms visuel, tel qu’un bouton, l’accès au composant par le biais du pool de threads système peut les résultats dans une exception ou simplement peut ne pas fonctionner. Éviter cet effet en définissant SynchronizingObject à un composant Windows Forms, ce qui entraîne la méthode qui gère le Elapsed événement à être appelé sur le même thread que le composant a été créé.

System_CAPS_noteRemarque

Même si le SynchronizingObject propriété n’est pas null, Elapsed événements peuvent se produire après la Dispose ou Stop méthode a été appelée ou après le Enabled propriété a été définie sur false, car le signal pour déclencher le Elapsed événement est toujours en file d’attente pour l’exécution sur un thread de pool de threads. Une façon de résoudre cette condition d’engorgement consiste à définir un indicateur qui indique le Gestionnaire d’événements pour le Elapsed événement à ignorer les événements suivants.

Si le Timer est utilisé dans Visual Studio dans un concepteur Windows Forms, SynchronizingObject est automatiquement défini sur le contrôle qui contient le Timer. Par exemple, si vous placez un Timer sur un concepteur pour Form1 (qui hérite de Form), la SynchronizingObject propriété du Timer est définie sur l’instance de Form1.

L’exemple suivant est une application Windows Forms qui sert d’un éditeur de texte simple. Lorsque le texte dans la zone de texte n’a pas été enregistré, l’application demande à l’utilisateur à des intervalles d’une minute souhaite enregistrer le contenu de la zone de texte. Pour ce faire, le Interval est définie sur 1 minute (60 000 millisecondes) et le SynchronizingObject est définie sur la Form objet.

using System;
using System.IO;
using  Timers = System.Timers;
using System.Windows.Forms;
public partial class Form1 : Form
{
    Timers.Timer timer = null;
    StreamWriter sw = null;
    bool hasChanged = false;
    bool dialogIsOpen = false;
    int elapsedMinutes = 0;
    // Cache the text box cache internally without saving it.
    String txt = "";

    public Form1()
    {
        InitializeComponent();

        this.Text = "Quick Text Editor";
        button1.Text = "Save";
        textBox1.Multiline = true;

        // Configure the SaveFile dialog
        saveFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
        saveFileDialog1.RestoreDirectory = true;

        // Create a timer with a 1-minute interval
        timer = new Timers.Timer(60000);
        // Define the event handler
        timer.Elapsed += this.PromptForSave;
        // Synchronize the timer with the text box
        timer.SynchronizingObject = this;
        // Start the timer
        timer.AutoReset = true;
    }

    private void PromptForSave(Object source, Timers.ElapsedEventArgs e)
    {
        if (hasChanged & (!dialogIsOpen)) {
            elapsedMinutes++;
            dialogIsOpen = true;
            if (MessageBox.Show(String.Format("{0} minutes have elapsed since the text was saved. Save it now? ",
                elapsedMinutes), "Save Text",
                MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                button1_Click(this, EventArgs.Empty);
                dialogIsOpen = false;
            }
        }
    }

    private void button1_Click(Object sender, EventArgs e)
    {
        if (String.IsNullOrEmpty(saveFileDialog1.FileName)) {
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
                sw = new StreamWriter(saveFileDialog1.FileName, false);
        }
        txt = textBox1.Text;
        hasChanged = false;
        timer.Stop();
    }

    private void form1_FormClosing(Object sender, FormClosingEventArgs e)
    {
        if (sw != null) {
            sw.Write(txt);
            sw.Close();
        }
    }

    private void textBox1_TextChanged(Object sender, EventArgs e)
    {
        hasChanged = true;
        timer.Start();
    }

}

The example requires that you add the following controls to the form:

  • A T:System.Windows.Forms.TextBox control named TextBox1 (its default name).

  • A T:System.Windows.Forms.Button control named Button1 (its default name).

  • A T:System.Windows.Forms.SaveFileDialog control named SaveSaveFileDialog1 (its default name) .

.NET Framework
Disponible depuis 1.1
Retour au début
Afficher: