2008-09-06 68 views
2

在我的C#程序中,我有一個代表正在運行的測試的線程,可以通過單擊標有「中斷執行」的按鈕來中止它。爲了使線程(因此測試)以優雅的方式終止(並且事先做一些重要的工作),該按鈕僅在一些明確定義的時刻被啓用,其中我抓住ThreadAbortedException,做Thread.ResetAbort()並且精美地死(即線程)。有沒有辦法確保在.NET線程中執行完整的代碼塊?

問題是,在可能中止的時間窗口中,有一些任務需要在開始時從頭到尾完成,因此,我擔心TAE。鎖不提供這樣的解決方案,而且,雖然finally塊做的,我不覺得它優雅在下列方式包裝的重要代碼:

try { 
} finally { 
    // vital code 
} 

但是,我沒有發現任何其他的解決辦法。

這是否延遲ThreadAbortException的干擾直到塊結束?

回答

4

將生成ThreadAbortException的情況可能很複雜。更好的選擇可能是問你爲什麼使用ThreadAbortExceptions。

更好的模式是簡單地使用一個標誌來指示正在運行的線程應該中止,然後在它正在工作時定期測試該標誌。如果已設置,則可以在此時拋出異常。

有了這種模式,您完全可以控制線程何時執行中止操作,並且不必擔心被中斷的關鍵操作。

3

使用Thread.BeginCriticalRegion()

通知主機執行即將進入的代碼,其中一個線程的影響,中止或者未處理的異常區域可能危及在應用領域的其他任務。

Thread.BeginCriticalRegion() 

//do important stuff here 

Thread.EndCriticalRegion() 
+0

雖然BeginCriticalRegion()可能在某種程度上,保證執行代碼,因爲您的應用程序可能會停止,否則,我想它不允許ThreadAbortExceptions打斷我的代碼的設備。 – 2008-09-17 17:16:57

相關問題