2009-11-24 5 views
1

Я хочу уточнить, как работает следующий код. Я изложил свои сомнения, чтобы получить ваш ответ.Уточнение AutoResetEvent

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() thread завершит выполнение.

  3. autoEvent.WaitOne(1000,false)

    Подождите 1 сек, чтобы получить сигнал от "CodingInCSharp") упаковывают, если я использую WaitOne (1000, правда), будет ли он убить нить, полученную от ThreadPool?

  4. Если я не установил ((AutoResetEvent)stateInfo).Set();, будет ли Main() бесконечно ждать сигнала?

ответ

1

WaitCallback выполнен в совместительству к главному методу, как только ThreadPool поток становится доступным.

Главный метод ждет 1 секунду для метода CodingInCSharp в потоке threadpool для установки сигнала. Если сигнал установлен в течение 1 секунды, основной метод печатает "Coding singalled(coding finished)". Если сигнал не установлен в течение 1 секунды, метод Main прерывает ожидание сигнала и печатает "Timed out waiting for coding". В обоих случаях метод Main продолжает ждать нажатия клавиши.

Установка сигнала или достижение таймаута не «убивает» нить.

Основной метод не будет ждать бесконечно, если сигнал не установлен, потому что ожидание сигнала прерывается, если сигнал не установлен в течение 1 секунды.

Смежные вопросы