Timer.SynchronizingObject Eigenschaft
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Dient zum Abrufen oder Festlegen des Objekts, das zum Marshallen von Ereignishandleraufrufen verwendet wird, die ausgegeben werden, wenn ein Intervall verstrichen ist.
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
Eigenschaftswert
Das ISynchronizeInvoke Objekt, das zum Marshallen der Ereignishandleraufrufe verwendet wird, die ausgegeben werden, wenn ein Intervall abgelaufen ist. Der Standardwert lautet null.
- Attribute
Beispiele
Das folgende Beispiel ist eine Windows Forms-App, die als sehr einfache Textdatei-Editor dient. Wenn der Text im Textfeld nicht gespeichert wurde, fragt die App den Benutzer in minutenlangen Abständen, ob der Inhalt des Textfelds gespeichert werden soll. Hierzu wird die Interval Eigenschaft auf eine Minute (60.000 Millisekunden) festgelegt, und die SynchronizingObject Eigenschaft wird auf das Form Objekt festgelegt.
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
Für das Beispiel müssen Sie dem Formular die folgenden Steuerelemente hinzufügen:
Ein TextBox Steuerelement mit dem Namen
TextBox1(Standardname).Ein Button Steuerelement mit dem Namen
Button1(Standardname).Ein SaveFileDialog Steuerelement mit dem Namen
SaveSaveFileDialog1(standardname) .
Hinweise
Wenn SynchronizingObject dies der Fall ist null, wird die Methode, die das Elapsed Ereignis behandelt, in einem Thread aus dem Systemthreadpool aufgerufen. Weitere Informationen zu Systemthreadpools finden Sie unter ThreadPool.
Wenn das Elapsed Ereignis von einer visuellen Komponente von Windows Forms behandelt wird, z. B. eine Schaltfläche, kann der Zugriff auf die Komponente über den Systemthreadpool zu einer Ausnahme führen oder einfach nicht funktionieren. Vermeiden Sie diesen Effekt, indem Sie auf eine Windows Forms-Komponente festlegen SynchronizingObject , wodurch die Methode, die das Elapsed Ereignis behandelt, für denselben Thread aufgerufen wird, auf dem die Komponente erstellt wurde.
Hinweis
Selbst wenn die SynchronizingObject Eigenschaft nicht nullvorhanden ist, können Ereignisse auftreten, Elapsed nachdem die Dispose Eigenschaft aufgerufen wurde oder Stop nachdem die Enabled Eigenschaft festgelegt falsewurde, da das Signal zum Auslösen des Elapsed Ereignisses immer für die Ausführung in einem Threadpoolthread in die Warteschlange gestellt wird. Eine Möglichkeit, diese Racebedingung zu beheben, besteht darin, ein Flag festzulegen, das dem Ereignishandler für das Elapsed Ereignis angibt, nachfolgende Ereignisse zu ignorieren.
Wenn die Timer In Visual Studio in einem Windows Forms-Designer verwendet wird, wird automatisch auf das Steuerelement festgelegt, SynchronizingObject das das TimerSteuerelement enthält. Wenn Sie z. B. einen Timer Designer für Form1 (der von erbt Form) platzieren, wird die SynchronizingObject Eigenschaft Timer auf die Instanz von Form1festgelegt.