我有一個計時器應該以500ms的間隔運行x次。目前我的代碼看起來是這樣的:x間隔後取消定時器
var i = 0;
var times = 10;
timer = new System.Threading.Timer(_ =>
{
if (timer == null || i >= times)
return;
Console.WriteLine("Run " + i);
if (i < times - 1)
i++;
else
{
timer.Dispose();
timer = null;
}
}, null, 500, 500);
這是一個可靠的方法來取消計時器,如果我要確保只有一個被創建和定時器變量引用?
間隔的數量在運行時是可變的。
你有點過頭了。一旦調用Dispose,它不會再次觸發(我檢查了反彙編的代碼,確實確保'Dispose'以線程安全的方式執行)。 另外,如果您在開始時遞增runCount,然後執行Dispose檢查,則不會出現競爭狀況。 –
@Johny,你是對的,因爲'Interlocked.Increment'應該處理任何競爭條件。我感覺最好在它周圍鎖定。談到多線程,我很謹慎。但感謝監督。 –
我知道這種感覺! :)另一點是,你可以省略「timer = null」部分以及空檢查。 –