我们有控制台应用程序:
namespace MyApplication
{
public void Main()
{
try
{
AppDomain.CurrentDomain.ProcessExit += (sender, eventArgs) => Stop();
Start();
Console.ReadLine();
}
finally
{
Close();
}
}
public void Start()
{
//...
}
public void Stop()
{
//...
}
}
因此,如果应用程序已正确停止(通过在控制台窗口中按Enter
),则会从Close()
&中调用finally
方法。 AppDomain.CurrentDomain.ProcessExit
但是当应用程序被Close button
关闭或被Task Manager
Close()
终止时,方法根本不会被调用。
问题是:
finally
阻止不起作用?Close button
处理控制台关闭?UPD 即使是对象的析构函数也没有被调用:
public class Watcher
{
Action _start;
Action _stop;
public Watcher(Action start, Action stop)
{
_start = start;
_stop = stop;
}
~Watcher()
{
_stop();
}
public void Start()
{
_start();
}
}
// And using as:
var w = new Watcher(Start, Stop);
w.Start();
不会调用析构函数!
答案 0 :(得分:1)
仅在完成Console.ReadLine()
呼叫时才会到达finally块,只有当您按下键盘上的Enter键时才会发生此呼叫。没有其他方法可以访问finally块中的代码。
要处理close button
,您需要订阅Win32事件,因为.NET不为它提供直接绑定。请参阅此问题中的建议:Capture console exit C#