System.Timers.Timer ve System.Windows.Forms.Timer'in her ikisi de ThreadPool'u kullanarak işletim sistemi zamanlayıcısı için bir tanıtıcıya sahip değildir, bu nedenle atılmış bir yerel zamanlayıcı kaynağı yoktur - yalnızca tamamlanmış bir iş parçacığı . ThreadPool tarafından geri dönüştürülen bir iş parçacığı yakalayabileceğinden emin değilim, ama yanılıyor olabilirim.
Belki rulo olabilir senin (bu test etmedim ve Dispose bir ManualResetEvent alarak daha yararlı olabilir) kendi: Eğer elden aramadan önce
void Run()
{
ManualResetEvent resetEvent = new ManualResetEvent(false);
System.Threading.Timer timer = new System.Threading.Timer(delegate { Console.WriteLine("Tick"); });
timer.Dispose(resetEvent);
MyTimer t = new MyTimer();
t.Interval = 1000;
t.Elapsed += delegate { t.Dispose(resetEvent); };
resetEvent.WaitOne();
}
public class MyTimer : System.Timers.Timer
{
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
}
public virtual void Dispose(WaitHandle handle)
{
handle.SafeWaitHandle.Close();
Dispose();
}
}
System.Timers.Timer Diske Olayı, System.Threading.Timer Dispose yöntemini çağırır göndermez işten çıkar. –
@Ian Olay, “Component.Dispose (disposing)” içinde aranıyor. Bu yüzden, base.Dispose() öğesini çağırmadan önce WaitHandle sinyalini sağlamanız ve özel Atımı (WaitHandle) kullanmanız gerekir. –