Per System.Timers.Timer, sul filo separato, se SynchronizingObject non è impostato.
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;
}
uscita si vedrebbe se DummyTimer sparato sulla intervallo di 5 secondi:
Main Thread Id: 9
12
12
12
12
12
...
Quindi, come si è visto, OnDummyTimerFired viene eseguito su filo lavoratori.
No, un'ulteriore complicazione - Se si riduce l'intervallo di dire 10 ms,
Main Thread Id: 9
11
13
12
22
17
...
Questo perché se l'esecuzione di prev OnDummyTimerFired non viene fatto quando la prossima tick viene licenziato, quindi .NET creerebbe una nuova filo per fare questo lavoro.
Complementare ulteriormente, "La classe System.Timers.Timer fornisce un modo semplice per affrontare questo dilemma: espone una proprietà pubblica SynchronizingObject. Impostare questa proprietà su un'istanza di un Windows Form (o un controllo su un Windows Form) assicurerà che il codice nel gestore eventi Elapsed venga eseguito sullo stesso thread su cui è stato creato l'istanza di SynchronizingObject. "
http://msdn.microsoft.com/en-us/magazine/cc164015.aspx#S2
fonte
2014-05-13 07:57:10
Ciò potrebbe portare a problemi. Si noti che, in generale, i thread del threadpool non sono progettati per processi a esecuzione prolungata. –