Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#阻止控制台应用程序关闭_C#_.net_Waithandle - Fatal编程技术网

C#阻止控制台应用程序关闭

C#阻止控制台应用程序关闭,c#,.net,waithandle,C#,.net,Waithandle,我尝试停止控制台应用程序关闭,但它在所有功能完成之前关闭。。停到90000然后控制台关闭的示例。。我希望它首先完成所有作业,然后关闭控制台。对不起,我的英语不好 例如: private delegate bool EventHandler(CtrlType sig); private enum CtrlType { CTRL_BREAK_EVENT = 1, CTRL_C_EVENT = 0, CTRL_CLOSE_EVEN

我尝试停止控制台应用程序关闭,但它在所有功能完成之前关闭。。停到90000然后控制台关闭的示例。。我希望它首先完成所有作业,然后关闭控制台。对不起,我的英语不好

例如:

    private delegate bool EventHandler(CtrlType sig);
    private enum CtrlType
    {
        CTRL_BREAK_EVENT = 1,
        CTRL_C_EVENT = 0,
        CTRL_CLOSE_EVENT = 2,
        CTRL_LOGOFF_EVENT = 5,
        CTRL_SHUTDOWN_EVENT = 6
    }
    private static EventHandler delegate0_0;
    [DllImport("Kernel32")]
    private static extern bool SetConsoleCtrlHandler(Program.EventHandler handler, bool add);
    private const int MF_BYCOMMAND = 0x00000000;
    public const int SC_CLOSE = 0xF060;

    static void Main(string[] args)
    {
        Program.delegate0_0 = (Program.EventHandler)Delegate.Combine(Program.delegate0_0, new Program.EventHandler(Program.smethod_1));
        Program.SetConsoleCtrlHandler(Program.delegate0_0, true);
        Console.ReadKey(true);
    }

    private static bool smethod_1(CtrlType enum0_0)
    {
        for (int i = 0; i < 10000000; i++)
        {
            Console.WriteLine(i);
        }

        return true;
    }
私有委托bool EventHandler(CtrlType sig);
私有枚举CtrlType
{
CTRL\u BREAK\u事件=1,
CTRL\u C\u事件=0,
CTRL\u CLOSE\u事件=2,
CTRL\u注销\u事件=5,
CTRL\u关机\u事件=6
}
私有静态事件处理程序delegate0\u 0;
[DllImport(“内核32”)]
私有静态外部bool setConsoletrlHandler(Program.EventHandler,bool add);
private const int MF_BYCOMMAND=0x00000000;
公共常数int SC_CLOSE=0xF060;
静态void Main(字符串[]参数)
{
Program.delegate0_0=(Program.EventHandler)Delegate.Combine(Program.delegate0_0,new Program.EventHandler(Program.smethod_1));
Program.setConsoletrlHandler(Program.delegate0\u 0,true);
Console.ReadKey(true);
}
私有静态bool smethod_1(CtrlType enum0_0)
{
对于(int i=0;i<10000000;i++)
{
控制台写入线(i);
}
返回true;
}

您可以通过让程序在程序结束时等待用户输入来停止:

Console.ReadLine();

原始线程:

在句柄上使用EventWaitHandle,以等待发出信号。 您使用的是非托管句柄,因此这是WIN32的
WaitForSingleObject(句柄h,DWORD duaration();

这就是C代码:


SafeWaitHandle
创建中的
true
,指示它应该与终结器一起清理。

这是不可能的。单击“关闭”按钮后,您有5秒钟的时间进行清理,就是这样。明智的做法是,在程序报告关闭按钮完成之前,不要单击“关闭”按钮。Ok dam..:(我试试看else@HansPassant如果您单击锁定的X按钮,它是否可能触发?例如,它显示“请按ESCAPE”如果您还没有看到它,并且您可能没有读过我的问题?公平地说,@user3290224,您的问题一点也不清楚,很容易被误解。是否愿意更详细地用文字表达您的代码试图做什么?
Console.ReadKey();
EventWaitHandle handle = new EventWaitHandle(false, EventResetMode.ManualReset);
handle.SafeWaitHandle = new Microsoft.Win32.SafeHandles.SafeWaitHandle(yourHandle,true);
handle.WaitOne();