C#阻止控制台应用程序关闭
我尝试停止控制台应用程序关闭,但它在所有功能完成之前关闭。。停到90000然后控制台关闭的示例。。我希望它首先完成所有作业,然后关闭控制台。对不起,我的英语不好 例如: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
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();