Thread.Sleep的替代方案?在C#中

时间:2009-12-18 04:49:28

标签: c# .net

我有另一个线程轮询用户输入。这个线程是主线程,可以一次睡几分钟。如果用户点击想要退出,可能会在控制台窗口关闭之前2分钟,这可能感觉没有响应。

如何让这个线程从Thread.Sleep唤醒?我需要使用另一个函数来睡眠并传入一个bool参考,以便检查线程何时唤醒并结束?

4 个答案:

答案 0 :(得分:4)

解决方案是“不要在你的UI线程上睡觉”。你应该有一个线程等待用户输入(而不是轮询),如果你有一个需要睡眠的线程(可能不是这种情况 - 听起来像是一个针对不同问题的hackish解决方法),那么这应该是分开的没有处理接口的线程。

答案 1 :(得分:4)

使用 Monitor.Wait,然后调用Monitor.Pulse或Monitor.PulseAll 唤醒线程。

答案 2 :(得分:1)

答案 3 :(得分:0)

一些建议:

  1. 如果您使用显式线程,可以尝试将ThreadType设置为“Background”以防止它阻止退出。
  2. 试试这个阻止:
  3. 主线程:

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

    在某些功能中:

    public void someFunction(object state) {
       Console.Write ("Enter something: ");
       Console.Readline();
       //... do your work ....
    
       ((AutoResetEvent)state).Set();
    }
    
    • 未经过严格测试...... YMMV:)