有一個簡單的方法來做到這一點(不是一個解決方法)
首先,您需要設置將火的時候,您的應用程序會死
// somewhere with global scope. On a singleton or in program class maybe
// this is set when you want to terminate your application
private static ManualResetEvent ExitWaitHandle = new ManualResetEvent(false);
一個事件,這是怎麼了在其他地方使用它
// the event you want to check but it's blocking your application termination
private static AutoResetEvent yourEvent = new AutoResetEvent(true);
// the method where you have the problem
private static void FooAsync()
{
try
{
WaitHandle.WaitAny(new WaitHandle[]{yourEvent, ExitWaitHandle});
Checkpoint();
// other stuff here
// check if thread must die
Checkpoint();
}
catch(ApplicationTerminatingException)
{
// thread must die, do cleanup and finalization stuff here
}
catch(Exception)
{
// holy cow! what should we do?
}
}
private void CheckPoint()
{
// fast check if the exit handle is set
if(ExitWaitHandle.WaitOne(0))
{
throw new ApplicationTerminatingException(); // custom exception
}
}
唯一的開銷是,「一些」代碼後,你需要設置一個檢查點,以中止你的線程。希望這是你正在尋找的。
嗯,你手上有一個討厭的問題。終止調試會話是使用Windows中最大的槍TerminateProcess()完成的。 Taskmgr.exe中使用的同類槍。只有一種可能的方式是,這不會終止進程,內核線程繁忙併且不能完成I/O請求。這絕對不是一個AutoResetEvent。沒有意義。 –
@Hans - 一旦連接調試器,我在調用堆棧中看到的WaitHandle不是信號的等待句柄,而是內核I/O任務的不同等待句柄?在這項任務中唯一的I/O是一些日誌記錄,這真的很簡單(只是每隔一段時間手動觸發一次,而不是以任何頻率發生) – Matt
我所知道的是,你所描述的並不會使感。因此,如果沒有任何文檔,我會立即假定描述是錯誤的。發佈堆棧跟蹤與非託管調試和Microsoft符號服務器啓用。 –