我在System.Threading.Timer我的一個專案中使用該類,我注意到回呼方法在前面的方法完成之前被呼叫,這與我的預期不同。
例如下面的代碼
var delta = new TimeSpan(0,0,1);
var timer = new Timer(TestClass.MethodAsync, null, TimeSpan.Zero, delta);
static class TestClass
{
static int i = 0;
public static async void MethodAsync(object _)
{
i ;
Console.WriteLine("method " i "started");
await Task.Delay(10000);
Console.WriteLine("method " i "finished");
}
}
有這個輸出
method 1started
method 2started
method 3started
method 4started
method 5started
method 6started
method 7started
method 8started
method 9started
method 10started
method 11started
method 11finished
method 12started
method 12finished
這當然不是執行緒安全的。我所期待的是,在上一次呼叫成功后以及在一段時間過后,將對回呼方法進行新的呼叫delta。
我正在尋找的是 Microsoft 的檔案中記錄了這種行為的位置,也許是否有一種內置方法可以讓它在開始新的呼叫之前等待回呼呼叫完成
uj5u.com熱心網友回復:
重疊事件處理程式的問題是經典多執行緒 .NET 計時器(theSystem.Threading.Timer和System.Timers.Timer)所固有的。在保留事件發布者訂閱者模型的同時嘗試解決此問題是困難、棘手且容易出錯的。.NET 6 引入了一個新的計時器,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/495285.html
