Domanda

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

È stato utile?

Soluzione

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top