我有一个相当奇怪的问题,我一直无法谷歌。
在一些几乎没有感觉的学校演示程序上工作,我需要有一个工作循环去做它的业务,直到它被CTRL-C信号中断,然后运行一些其他功能。完成后,程序将恢复它之前停止的工作循环。
所有这一切都很有效,新的按键事件是这样完成的:
Console.TreatControlCAsInput = false;
Console.CancelKeyPress += new ConsoleCancelEventHandler(interrupt);
按下CTRL-C时,“中断”方法被正确调用并执行一次。
当它通过时,我似乎完全无法通过中断信号再次调用它。任何后续的CTRL-C按键都被完全忽略。
“interrupt”方法以.Join结束与其父线程合并,因为事件处理程序由于某种原因在单独的线程上运行。
是什么阻止我多次调用中断方法?
答案 0 :(得分:2)
Thread.Join
没有“合并”线程。它阻塞当前线程,直到另一个线程完成。当你加入主线程时,这将永远不会发生,直到程序退出。
完全删除该通话。
答案 1 :(得分:2)
您是否将Cancel
属性设置为true
?这对我有用:
using System;
using System.Threading;
class Test
{
static void Main()
{
Console.TreatControlCAsInput = false;
Console.CancelKeyPress += (sender, args) => {
// We want to keep going...
args.Cancel = true;
Console.WriteLine("Handler called");
};
Console.WriteLine("Go for it!");
for (int i = 0; i < 10; i++)
{
Console.WriteLine(i);
Thread.Sleep(1000);
}
}
}
根据Daniel的回答,目前还不清楚你的线程是什么样的 - 这可能是另一个不正确的方面。
答案 2 :(得分:1)
Console.TreatControlCAsInput看起来不应该设置为false:
如果Ctrl + C被视为普通输入,则为true;否则,错误。