2014-01-24 78 views
0

我已經在我的示例應用程序下面的代碼:MaualResetEventSlim沒有停止線程

private static ManualResetEventSlim _screenSaverOn = new ManualResetEventSlim(); 
private static ManualResetEventSlim _screenSaverOff = new ManualResetEventSlim(); 

在我已經初始化兩個線程類的構造函數:由這些線程執行

Thread threadOn = new Thread(CheckIfScreenSaverIsOn) {IsBackground = true}; 
Thread threadOff = new Thread(CheckIfScreenSaverIsOff) {IsBackground = true}; 

threadOn.Start(); 
threadOff.Start(); 

的方法是:

private static void CheckIfScreenSaverIsOn() 
{ 
    log.Info("Thread1 - started running"); 
    while (true) 
    { 
     if (NativeMethods.IsScreensaverRunning()) 
     { 
      log.Info("Thread1 - Screen Saver Started Running"); 
      _screenSaverOff.Set(); 
      log.Info("Thread1 - Waiting"); 
      _screenSaverOn.Wait(); 
      log.Info("Thread1 - Started Again"); 
     } 

     Thread.Sleep(2000); 
    } 
} 

private static void CheckIfScreenSaverIsOff() 
{ 
    log.Info("Thread2 - Started Running"); 
    _screenSaverOff.Wait(); 

    while (true) 
    { 
     // returns true/false 
     if (!NativeMethods.IsScreensaverRunning()) 
     { 
      log.Info("Thread2 - Screen Saver Stopped Running"); 
      _screenSaverOn.Set(); 
      log.Info("Thread2 - Waiting"); 
      _screenSaverOff.Wait(); 
      log.Info("Thread2 - Started Again"); 
     } 

     Thread.Sleep(2000); 
    } 
} 

我面臨的問題是,「thread2」沒有得到即使在調用_screenSaverOff.Wait()方法後也會被阻止。登錄如下條目:

2014-01-24 16:43:16,087 [4] INFO SystemEvent.TimeTracker Thread1 - started running 
2014-01-24 16:43:16,088 [5] INFO SystemEvent.TimeTracker Thread2 - Started Running 
2014-01-24 16:46:16,129 [4] INFO SystemEvent.TimeTracker Thread1 - Screen Saver Started Running 
2014-01-24 16:46:16,130 [4] DEBUG SystemEvent.TimeTracker Original Start Time : 01/24/2014 16:43:16 
2014-01-24 16:46:16,131 [4] DEBUG SystemEvent.TimeTracker Current Time : 01/24/2014 16:46:16 
2014-01-24 16:46:16,131 [4] DEBUG SystemEvent.TimeTracker Total Active Minute : 3 
2014-01-24 16:46:16,188 [4] INFO SystemEvent.TimeTracker Thread1 - Waiting 
2014-01-24 16:46:26,189 [5] INFO SystemEvent.TimeTracker Thread2 - Screen Saver Stopped Running 
2014-01-24 16:46:26,189 [4] INFO SystemEvent.TimeTracker Thread1 - Started Again 
2014-01-24 16:46:26,189 [5] INFO SystemEvent.TimeTracker Thread2 - Waiting 
2014-01-24 16:46:26,189 [5] INFO SystemEvent.TimeTracker Thread2 - Started Again 
2014-01-24 16:46:28,191 [5] INFO SystemEvent.TimeTracker Thread2 - Screen Saver Stopped Running 
2014-01-24 16:46:28,191 [5] INFO SystemEvent.TimeTracker Thread2 - Waiting 
2014-01-24 16:46:28,191 [5] INFO SystemEvent.TimeTracker Thread2 - Started Again 
2014-01-24 16:46:30,191 [5] INFO SystemEvent.TimeTracker Thread2 - Screen Saver Stopped Running 
2014-01-24 16:46:30,191 [5] INFO SystemEvent.TimeTracker Thread2 - Waiting 
2014-01-24 16:46:30,191 [5] INFO SystemEvent.TimeTracker Thread2 - Started Again 
2014-01-24 16:46:32,192 [5] INFO SystemEvent.TimeTracker Thread2 - Screen Saver Stopped Running 

感謝 爬完米什拉

+1

**手動**重置事件,並且在您的代碼中沒有看到任何對這些事件調用「重置」的任何事件 - 一旦它們被設置,它們就會保持設置。 –

回答

2

您使用手動復位的事件,但你永遠不進行重置。你需要撥打Reset,否則他們會一直保持信號,一旦你設置了它們。