Đối với System.Timers.Timer, trên chuỗi riêng biệt, nếu SynchrofyingObject không được đặt.
static System.Timers.Timer DummyTimer = null;
static void Main(string[] args)
{
try
{
Console.WriteLine("Main Thread Id: " + System.Threading.Thread.CurrentThread.ManagedThreadId);
DummyTimer = new System.Timers.Timer(1000 * 5); // 5 sec interval
DummyTimer.Enabled = true;
DummyTimer.Elapsed += new System.Timers.ElapsedEventHandler(OnDummyTimerFired);
DummyTimer.AutoReset = true;
DummyTimer.Start();
Console.WriteLine("Hit any key to exit");
Console.ReadLine();
}
catch (Exception Ex)
{
Console.WriteLine(Ex.Message);
}
return;
}
static void OnDummyTimerFired(object Sender, System.Timers.ElapsedEventArgs e)
{
Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId);
return;
}
Đầu ra bạn sẽ thấy nếu DummyTimer được kích hoạt trong khoảng thời gian 5 giây:
Main Thread Id: 9
12
12
12
12
12
...
Vì vậy, như đã thấy, OnDummyTimerFosystem được thực thi trên chuỗi Công nhân.
Không, phức tạp hơn - Nếu bạn giảm khoảng thời gian xuống còn 10 ms,
Main Thread Id: 9
11
13
12
22
17
...
Điều này là do nếu quá trình thực thi OnDummyTimerFosystem trước đó không được thực hiện khi đánh dấu tiếp theo được kích hoạt, thì .NET sẽ tạo một luồng mới để thực hiện công việc này.
Làm phức tạp thêm mọi thứ, "Lớp System.Timers.Timer cung cấp một cách dễ dàng để giải quyết tình huống khó xử này — nó làm lộ thuộc tính SynchrofyingObject công khai. Đặt thuộc tính này thành một bản sao của Windows Form (hoặc một điều khiển trên Windows Form) sẽ đảm bảo rằng mã trong trình xử lý sự kiện đã qua của bạn chạy trên cùng một chuỗi mà trên đó SynchronizationObject đã được khởi tạo. "
http://msdn.microsoft.com/en-us/magazine/cc164015.aspx#S2