Timer.SynchronizingObject Propriété
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
Obtient ou définit l'objet utilisé pour marshaler les appels du gestionnaire d'événements émis quand un intervalle a expiré.
public:
property System::ComponentModel::ISynchronizeInvoke ^ SynchronizingObject { System::ComponentModel::ISynchronizeInvoke ^ get(); void set(System::ComponentModel::ISynchronizeInvoke ^ value); };
public System.ComponentModel.ISynchronizeInvoke SynchronizingObject { get; set; }
public System.ComponentModel.ISynchronizeInvoke? SynchronizingObject { get; set; }
[System.Timers.TimersDescription("TimerSynchronizingObject")]
public System.ComponentModel.ISynchronizeInvoke SynchronizingObject { get; set; }
[System.Timers.TimersDescription("TimerSynchronizingObject")]
[System.ComponentModel.Browsable(false)]
public System.ComponentModel.ISynchronizeInvoke SynchronizingObject { get; set; }
member this.SynchronizingObject : System.ComponentModel.ISynchronizeInvoke with get, set
[<System.Timers.TimersDescription("TimerSynchronizingObject")>]
member this.SynchronizingObject : System.ComponentModel.ISynchronizeInvoke with get, set
[<System.Timers.TimersDescription("TimerSynchronizingObject")>]
[<System.ComponentModel.Browsable(false)>]
member this.SynchronizingObject : System.ComponentModel.ISynchronizeInvoke with get, set
Public Property SynchronizingObject As ISynchronizeInvoke
Valeur de propriété
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
.
- Attributs
Exemples
L’exemple suivant est une application Windows Forms qui sert d’éditeur de fichier texte très simple. Lorsque le texte de la zone de texte n’a pas été enregistré, l’application demande à l’utilisateur à intervalles d’une minute s’il souhaite enregistrer le contenu de la zone de texte. Pour ce faire, la Interval propriété est définie sur une minute (60 000 millisecondes) et la SynchronizingObject propriété est définie sur l’objet Form .
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();
}
}
Imports System.IO
Imports System.Timers
Public Class Form1
' Create the timer to fire at a 60-second interval.
Dim WithEvents timer As New System.Timers.Timer(60000)
Dim sw As StreamWriter
Dim hasChanged As Boolean
Dim dialogIsOpen As Boolean = False
Dim elapsedMinutes As Integer = 0
' Cache the text box internally without saving it.
Dim txt As String = ""
Public Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
Me.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 Timer(2000)
' Synchronize the timer with the text box
timer.SynchronizingObject = Me
' Start the timer
timer.AutoReset = True
End Sub
Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
hasChanged = True
timer.Start()
End Sub
Friend Sub PromptForSave(sender As Object, e As ElapsedEventArgs) _
Handles timer.Elapsed
If hasChanged And Not dialogIsOpen Then
elapsedMinutes += 1
dialogIsOpen = True
If MsgBox(String.Format("{0} minutes have elapsed since the text was saved. Save it now? ",
elapsedMinutes), MsgBoxStyle.YesNoCancel Or MsgBoxStyle.Question,
"Save Text") = MsgBoxResult.Yes Then
If dialogIsOpen Then
Button1_Click(Me, EventArgs.Empty)
dialogIsOpen = False
End If
End If
End If
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
If String.IsNullOrEmpty(SaveFileDialog1.FileName) Then
If SaveFileDialog1.ShowDialog() = DialogResult.OK Then
sw = New StreamWriter(SaveFileDialog1.FileName, False)
End If
End If
txt = TextBox1.Text
hasChanged = False
elapsedMinutes = 0
timer.Stop()
End Sub
Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
If sw IsNot Nothing Then
sw.Write(txt)
sw.Close()
End If
End Sub
End Class
L’exemple nécessite que vous ajoutiez les contrôles suivants au formulaire :
Contrôle TextBox nommé
TextBox1
(son nom par défaut).Contrôle Button nommé
Button1
(son nom par défaut).Contrôle SaveFileDialog nommé
SaveSaveFileDialog1
(son nom par défaut) .
Remarques
Quand SynchronizingObject a null
la valeur , la méthode qui gère l’événement Elapsed est appelée sur un thread du pool de threads système. Pour plus d’informations sur les pools de threads système, consultez ThreadPool.
Lorsque l’événement Elapsed est géré par un composant Windows Forms visuel, tel qu’un bouton, l’accès au composant via le pool de threads système peut entraîner une exception ou tout simplement ne pas fonctionner. Évitez cet effet en définissant SynchronizingObject sur un composant Windows Forms, ce qui entraîne l’appel de la méthode qui gère l’événement Elapsed sur le thread sur lequel le composant a été créé.
Notes
Même si la SynchronizingObject propriété n’a pas null
la valeur , Elapsed les événements peuvent se produire après l’appel de la Dispose méthode ou Stop après que la Enabled propriété a été définie false
sur , car le signal permettant de déclencher l’événement Elapsed est toujours mis en file d’attente pour l’exécution sur un thread de pool de threads. Une façon de résoudre cette condition de concurrence consiste à définir un indicateur qui indique au gestionnaire d’événements pour l’événement Elapsed d’ignorer les événements suivants.
Si est Timer 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é de Timer est définie sur le instance de Form1
.