2011-08-02 64 views
1

我有三個線程:主線程和兩個定時器。第一個定時器在一段時間後激活第二個定時器,然後禁用它自己。C#延遲線程

我使用「Thread.Sleep(int)」來延遲第二個定時器的激活。但是,當「睡眠」功能正常工作時,整個程序會暫停。

如何在不暫停整個程序的情況下暫停一個線程?

+2

向我們展示一些代碼。你如何初始化定時器? – weismat

+0

是的,給我們看一些代碼。 RTL中至少有三種定時器。你在使用哪一個? –

回答

3

定時器不會在新線程中執行您的代碼。在他們的間隔之後,他們在Windows消息隊列中引發主線程然後執行的事件,因此Thread.Sleep(int)爲什麼暫停所有內容。

要解決這個問題,您需要真正開始自己的線程。這是一個簡單的過程:

 Thread t = new Thread(new ThreadStart(() => { 
      // Do Something without parameters 
     })); 
     t.Start(); 

 Thread t = new Thread(new ParameterizedThreadStart((obj) => { 
      // Do Something with parameters 
     })); 
     Object obj = ...; 
     t.Start(obj); 

有啓動它會影響您的應用程序的其他部分如IsBackground

+4

這完全取決於您使用的計時器的類型。 'System.Windows.Forms.Timer'在UI線程上引發'Elapsed'事件。 'System.Timers.Timer'在一個池線程或者在UI線程上引發它,如果你提供一個'SynchronizingObject'的話。 'System.Threading.Timer'總是在一個線程池線程上執行它的回調。 –

+0

感謝您的澄清。我忘記了那麼多定時器,並假定'System.Windows.Forms.Timer'。 –

0

您可以使用任務並行庫的延續風格編程。

0
之前,你可能想在一個線程等參數進行設置

該程序將在3秒後啓動第一個定時器。啓動第二個定時器後,第一個定時器將停止。第二個計時器將在此後每秒鐘提起事件:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Timer t1 = new Timer(); 
     t1.Elapsed += new ElapsedEventHandler(t1_Elapsed); 
     t1.AutoReset = false; 
     t1.Interval = 5000; 
     t1.Start(); 

     while (true) 
     { } 
    } 

    static void t1_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     Console.WriteLine("t1 timer elapsed"); 
     Timer t2 = new Timer(); 
     t2.Elapsed += new ElapsedEventHandler(t2_Elapsed); 
     t2.AutoReset = true; 
     t2.Interval = 1000; 
     t2.Start(); 
    } 

    static void t2_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     Console.WriteLine("t2 timer elapsed"); 
    } 
}