Timer.SynchronizingObject Özellik
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
Bir aralık geçtiğinde verilen olay işleyici çağrılarını sıralamak için kullanılan nesneyi alır veya ayarlar.
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
Özellik Değeri
Bir ISynchronizeInvoke aralık geçtiğinde verilen olay işleyici çağrılarını sıralamak için kullanılan nesneyi temsil eden. Varsayılan değer: null
.
- Öznitelikler
Örnekler
Aşağıdaki örnek, çok basit bir metin dosyası düzenleyicisi olarak hizmet veren bir Windows Forms uygulamasıdır. Metin kutusundaki metin kaydedilmediğinde, uygulama kullanıcıya bir dakikalık aralıklarla metin kutusunun içeriğini kaydetmek isteyip istemediğini sorar. Bunu yapmak için özelliği Interval bir dakika (60.000 milisaniye) olarak ayarlanır ve SynchronizingObject özelliği nesnesine Form ayarlanır.
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
Örnek, forma aşağıdaki denetimleri eklemenizi gerektirir:
TextBox adlı
TextBox1
bir denetim (varsayılan adı).Button adlı
Button1
bir denetim (varsayılan adı).SaveFileDialog adlı
SaveSaveFileDialog1
bir denetim (varsayılan adı) .
Açıklamalar
olduğunda SynchronizingObjectnull
, olayı işleyen Elapsed yöntem sistem iş parçacığı havuzundan bir iş parçacığında çağrılır. Sistem iş parçacığı havuzları hakkında daha fazla bilgi için bkz ThreadPool. .
Elapsed Olay bir düğme gibi görsel Windows Forms bileşeni tarafından işlendiğinde, sistem iş parçacığı havuzu aracılığıyla bileşene erişmek bir özel duruma neden olabilir veya çalışmayabilir. Olayı işleyen Elapsed yöntemin bileşenin oluşturulduğu iş parçacığında çağrılmasını sağlayan bir Windows Forms bileşeni ayarlayarak bu etkiden SynchronizingObject kaçının.
Not
SynchronizingObject Özelliği olmasa null
bile, Elapsed veya Stop yöntemi çağrıldıktan sonra Dispose veya özelliği olarak false
ayarlandıktan sonra Enabled olaylar gerçekleşebilir çünkü olayı tetikleye Elapsed sinyal her zaman bir iş parçacığı havuzu iş parçacığında yürütülmek üzere kuyruğa alınır. Bu yarış durumunu çözmenin bir yolu, olayın olay işleyicisine Elapsed sonraki olayları yoksaymayı bildiren bir bayrak ayarlamaktır.
Timer bir Windows Forms tasarımcısında Visual Studio'da kullanılıyorsa, SynchronizingObject otomatik olarak öğesini içeren Timerdenetime ayarlanır. Örneğin, için Form1
bir Timer tasarımcıya yerleştirirseniz (öğesinden Formdevralır), SynchronizingObject özelliği Timer örneğine Form1
ayarlanır.