我有另一个线程轮询用户输入。这个线程是主线程,可以一次睡几分钟。如果用户点击想要退出,可能会在控制台窗口关闭之前2分钟,这可能感觉没有响应。
如何让这个线程从Thread.Sleep唤醒?我需要使用另一个函数来睡眠并传入一个bool参考,以便检查线程何时唤醒并结束?
答案 0 :(得分:4)
解决方案是“不要在你的UI线程上睡觉”。你应该有一个线程等待用户输入(而不是轮询),如果你有一个需要睡眠的线程(可能不是这种情况 - 听起来像是一个针对不同问题的hackish解决方法),那么这应该是分开的没有处理接口的线程。
答案 1 :(得分:4)
使用 Monitor.Wait,然后调用Monitor.Pulse或Monitor.PulseAll 唤醒线程。
答案 2 :(得分:1)
答案 3 :(得分:0)
一些建议:
主线程:
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();
}