AutoResetEvent澄清

时间:2009-11-24 04:38:01

标签: c# multithreading

我想澄清以下代码是如何工作的。我已经逐条列出了我的疑问以获得你的回复。

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();
    }
}
  1. static AutoResetEvent autoEvent = new AutoResetEvent(false);

    初始阶段,信号设置为假。

  2. ThreadPool.QueueUserWorkItem(new WaitCallback(CodingInCSharp), autoEvent);

    从ThreadPool中选择一个线程,并使该线程执行CodingInCSharp。    WaitCallback的目的是在Main()线程之后执行该方法    完成执行。

  3. autoEvent.WaitOne(1000,false)

    等待1秒钟从“CodingInCSharp”获取信号 如果我使用WaitOne(1000, true ),它会杀死它收到的线程 线程池?

  4. 如果我没有设置((AutoResetEvent)stateInfo).Set();,Main()会无限期地等待信号吗?

1 个答案:

答案 0 :(得分:1)

一旦线程池线程可用,WaitCallback就会在并发中执行到Main方法。

Main方法等待1秒钟,用于线程池线程上的CodingInCSharp方法来设置信号。如果信号在1秒内设置,Main方法将打印"Coding singalled(coding finished)"。如果信号未在1秒内设置,则Main方法将中止等待信号并打印"Timed out waiting for coding"。在这两种情况下,Main方法都会等待按下一个键。

设置信号或达到超时不会“杀死”一个线程。

如果未设置信号,Main方法将无法无限期地等待,因为如果信号未在1秒内设置,则等待信号中止。