0

我遇到了一个相当奇怪的问题,我无法通过 Google 搜索出来。

在一些几乎没有意义的学校演示程序上工作,我需要有一个工作循环来处理它的业务,直到它被一个 CTRL-C 信号中断,然后运行一些其他功能。完成后,程序会从上次中断的地方恢复它的前一个工作循环。

一切都很好,新的按键事件是这样完成的:

Console.TreatControlCAsInput = false;
Console.CancelKeyPress += new ConsoleCancelEventHandler(interrupt);

当按下 CTRL-C 时,“中断”方法被正确调用并执行......一次。

当它通过时,我似乎完全无法通过中断信号再次调用它。任何后续的 CTRL-C 按键都将被完全忽略。

“中断”方法以 .Join 结尾以与其父线程合并,因为事件处理程序出于某种原因在单独的线程上运行。

是什么阻止我根据需要多次调用中断方法?

4

3 回答 3

2

Thread.Join不会“合并”线程。它阻塞当前线程,直到另一个线程完成。当您加入主线程时,这将永远不会发生,直到程序退出。

只需完全删除该呼叫。

于 2013-04-04T15:54:01.677 回答
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);
        }
    }
}

目前尚不清楚您的线程是什么样的 - 根据丹尼尔的回答,这很可能是另一个不正确的方面。

于 2013-04-04T15:56:16.677 回答
1

Console.TreatControlCAsInput看起来不应该设置为 false:

如果 Ctrl+C 被视为普通输入,则为 true;否则为假。

于 2013-04-04T15:57:05.557 回答