Timer.SynchronizingObject Properti
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Mendapatkan atau mengatur objek yang digunakan untuk marshal panggilan penanganan aktivitas yang dikeluarkan ketika interval telah berlalu.
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
Nilai Properti
ISynchronizeInvoke yang mewakili objek yang digunakan untuk melakukan marshal panggilan penanganan aktivitas yang dikeluarkan ketika interval telah berlalu. Default adalah null
.
- Atribut
Contoh
Contoh berikut adalah aplikasi Formulir Windows yang berfungsi sebagai editor file teks yang sangat sederhana. Saat teks dalam kotak teks belum disimpan, aplikasi bertanya kepada pengguna pada interval satu menit apakah mereka ingin menyimpan konten kotak teks. Untuk melakukan ini, Interval properti diatur ke satu menit (60.000 milidetik), dan SynchronizingObject properti diatur ke Form objek .
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
Contoh ini mengharuskan Anda menambahkan kontrol berikut ke formulir:
TextBox Kontrol bernama
TextBox1
(nama defaultnya).Button Kontrol bernama
Button1
(nama defaultnya).SaveFileDialog Kontrol bernama
SaveSaveFileDialog1
(nama defaultnya) .
Keterangan
Ketika SynchronizingObject adalah null
, metode yang menangani peristiwa dipanggil pada utas dari kumpulan utas Elapsed sistem. Untuk informasi selengkapnya tentang kumpulan utas sistem, lihat ThreadPool.
Elapsed Ketika peristiwa ditangani oleh komponen visual Formulir Windows, seperti tombol, mengakses komponen melalui kumpulan utas sistem dapat mengakibatkan pengecualian atau mungkin tidak berfungsi. Hindari efek ini dengan mengatur SynchronizingObject ke komponen Formulir Windows, yang menyebabkan metode yang menangani peristiwa dipanggil pada utas Elapsed yang sama dengan tempat komponen dibuat.
Catatan
Bahkan jika SynchronizingObject properti bukan null
, Elapsed peristiwa dapat terjadi setelah Dispose metode atau Stop dipanggil atau setelah Enabled properti diatur ke false
, karena sinyal untuk menaikkan Elapsed peristiwa selalu diantrekan untuk dieksekusi pada utas kumpulan utas. Salah satu cara untuk mengatasi kondisi balapan ini adalah dengan mengatur bendera yang memberi tahu penanganan aktivitas agar Elapsed peristiwa mengabaikan peristiwa berikutnya.
Timer Jika digunakan di dalam Visual Studio dalam perancang Formulir Windows, SynchronizingObject secara otomatis diatur ke kontrol yang berisi Timer. Misalnya, jika Anda menempatkan Timer pada perancang untuk Form1
(yang mewarisi dari Form), SynchronizingObject properti diatur Timer ke instans Form1
.