我想澄清以下代码是如何工作的。我已经逐条列出了我的疑问以获得你的回复。
class AutoResetEventDemo
{
static AutoResetEvent autoEvent = new AutoResetEvent(false);
static void Main()
{
Console.WriteLine("...Main starting...");
ThreadPool.QueueUserWorkItem
(new WaitCallback(CodingInCSharp), autoEvent);
if(autoEvent.WaitOne(1000, false))
{
Console.WriteLine("Coding singalled(coding finished)");
}
else
{
Console.WriteLine("Timed out waiting for coding");
}
Console.WriteLine("..Main ending...");
Console.ReadKey(true);
}
static void CodingInCSharp(object stateInfo)
{
Console.WriteLine("Coding Begins.");
Thread.Sleep(new Random().Next(100, 2000));
Console.WriteLine("Coding Over");
((AutoResetEvent)stateInfo).Set();
}
}
static AutoResetEvent autoEvent = new AutoResetEvent(false);
初始阶段,信号设置为假。
ThreadPool.QueueUserWorkItem(new WaitCallback(CodingInCSharp), autoEvent);
从ThreadPool中选择一个线程,并使该线程执行CodingInCSharp。 WaitCallback的目的是在Main()线程之后执行该方法 完成执行。
autoEvent.WaitOne(1000,false)
等待1秒钟从“CodingInCSharp”获取信号 如果我使用WaitOne(1000, true ),它会杀死它收到的线程 线程池?
如果我没有设置((AutoResetEvent)stateInfo).Set();
,Main()会无限期地等待信号吗?
答案 0 :(得分:1)
一旦线程池线程可用,WaitCallback就会在并发中执行到Main方法。
Main方法等待1秒钟,用于线程池线程上的CodingInCSharp方法来设置信号。如果信号在1秒内设置,Main方法将打印"Coding singalled(coding finished)"
。如果信号未在1秒内设置,则Main方法将中止等待信号并打印"Timed out waiting for coding"
。在这两种情况下,Main方法都会等待按下一个键。
设置信号或达到超时不会“杀死”一个线程。
如果未设置信号,Main方法将无法无限期地等待,因为如果信号未在1秒内设置,则等待信号中止。