我有三个线程:主线程和两个计时器。第一个计时器在一段时间后激活第二个计时器,然后自行禁用。
我使用"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
您可以使用任务并行库的延续风格编程。
此程序将在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");
}
}