2010-07-12 5 views
4

В этом коде я хочу приостановить/возобновить поток, используя переменную AutoResetEvent и bool. Можно ли приостановить без проверки каждый раз (в цикле работы()), если заблокировано == true? Тестирование «заблокированной» переменной требует блокировки, и я думаю, что это занимает много времени.Pause/Resume thread whith AutoResetEvent

class MyClass 
    { 
     AutoResetEvent wait_handle = new AutoResetEvent(); 
     bool blocked = false; 

     void Start() 
     { 
      Thread thread = new Thread(Work); 
      thread.Start(); 
     } 

     void Pause() 
     { 
      blocked = true; 
     } 

     void Resume() 
     { 
      blocked = false; 
      wait_handle.Set(); 
     } 

     private void Work() 
     { 
      for(int i = 0; i < 1000000; i++) 
      { 
       if(blocked) 
        wait_handle.WaitOne(); 

       Console.WriteLine(i); 
      } 
     } 
    } 

ответ

9

Да, вы можете избежать теста вы выполняете с помощью ManualResetEvent.

ManualResetEvent будет пропускать ваш поток до тех пор, пока он «установлен» (сигнализирован), но в отличие от AutoResetEvent, который вы имели ранее, он автоматически не перезагружается, когда поток проходит через него. Это означает, что вы можете оставить его Устанавливать, чтобы разрешить работу в вашей петле, и можете сбросить его до паузы:

class MyClass 
{ 
    // set the reset event to be signalled initially, thus allowing work until pause is called. 

    ManualResetEvent wait_handle = new ManualResetEvent (true); 

    void Start() 
    { 
     Thread thread = new Thread(Work); 
     thread.Start(); 
    } 

    void Pause() 
    { 

     wait_handle.Reset(); 
    } 

    void Resume() 
    { 
     wait_handle.Set(); 
    } 

    private void Work() 
    { 
     for(int i = 0; i < 1000000; i++) 
     { 
      // as long as this wait handle is set, this loop will execute. 
      // as soon as it is reset, the loop will stop executing and block here. 
      wait_handle.WaitOne(); 

      Console.WriteLine(i); 
     } 
    } 
}