I have following code in my sample application :

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

In constructor of the class I have initialized two threads :

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

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

The methods executed by these threads are :

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);
    }
}

The issue I am facing is that, the "thread2" is not getting blocked even after calling the _screenSaverOff.Wait() method. Log entries given below :

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

Thanks Pawan Mishra

有帮助吗?

解决方案

You're using manual reset events, but you never reset them. You need to call Reset otherwise they'll always stay signalled once you've set them.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top