我有三個線程:主線程和兩個定時器。第一個定時器在一段時間後激活第二個定時器,然後禁用它自己。C#延遲線程
我使用「Thread.Sleep(int)」來延遲第二個定時器的激活。但是,當「睡眠」功能正常工作時,整個程序會暫停。
如何在不暫停整個程序的情況下暫停一個線程?
我有三個線程:主線程和兩個定時器。第一個定時器在一段時間後激活第二個定時器,然後禁用它自己。C#延遲線程
我使用「Thread.Sleep(int)」來延遲第二個定時器的激活。但是,當「睡眠」功能正常工作時,整個程序會暫停。
如何在不暫停整個程序的情況下暫停一個線程?
定時器不會在新線程中執行您的代碼。在他們的間隔之後,他們在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
這完全取決於您使用的計時器的類型。 'System.Windows.Forms.Timer'在UI線程上引發'Elapsed'事件。 'System.Timers.Timer'在一個池線程或者在UI線程上引發它,如果你提供一個'SynchronizingObject'的話。 'System.Threading.Timer'總是在一個線程池線程上執行它的回調。 –
感謝您的澄清。我忘記了那麼多定時器,並假定'System.Windows.Forms.Timer'。 –
您可以使用任務並行庫的延續風格編程。
該程序將在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");
}
}
向我們展示一些代碼。你如何初始化定時器? – weismat
是的,給我們看一些代碼。 RTL中至少有三種定時器。你在使用哪一個? –