tags:

views:

193

answers:

4

I have another thread polling user input. This thread is the main thread and can sleep minutes at a time. If the user hits wants to quit it may be 2+ minutes before the console window shuts down which may feel not responsive.

How can i make this thread wake up from Thread.Sleep? Do i need to use another function to sleep and pass in a bool ref for it to check when the thread wake up and end?

+4  A: 

The solution is "Don't sleep on your UI thread". You should have a thread waiting for user input (not polling), and if you have a thread which needs to sleep (which probably isn't the case - it sounds like a hackish workaround to a different problem), then that should be separate thread that isn't handling the interface.

Anon.
+5  A: 

Use Monitor.Wait instead, and call Monitor.Pulse or Monitor.PulseAll to wake the thread up.

Pandiya Chendur
Don't forget to mention you need to use this inside a `lock` statement or a Monitor.Enter/Exit pair.
Martinho Fernandes
I would have not figure this out without that lock comment
acidzombie24
+1  A: 

Have a look at the blocking queue:

http://msdn.microsoft.com/en-us/magazine/cc163427.aspx#S4

Andy West
A: 

Couple of suggestions:

  1. If your using explicit threads you can try setting ThreadType to "Background" to prevent it from blocking an exit.
  2. Try this as how you block:

main thread:

AutoResetEvent waitingEvent = new AutoResetEvent(false);
bool doneFlag = false
Thread myUIInputThread = new Thread(someFunction);

myUIInputThread.Start(waitingEvent);

while (!doneFlag) {
   doneFlag = waitingEvent.WaitOne(1000);
   if (!doneFlag) {
      Console.Writeline("Still waiting for the input thread...");
   }
}

In some function:

public void someFunction(object state) {
   Console.Write ("Enter something: ");
   Console.Readline();
   //... do your work ....

   ((AutoResetEvent)state).Set();
}
  • Not tested for exactness... YMMV :)
GrayWizardx