2012-03-12 78 views
3

在我的Windows窗體應用程序中,我需要調用第三方數學庫(Accord.NET)的長時間運行操作。在計算過程中,我希望保持GUI響應,並且讓用戶可以取消長時間運行。非合作取消異步操作

有沒有辦法在後臺線程中執行該函數,並給予用戶取消它的可能性?請注意,我想調用的長時間運行函數位於外部庫中,並且不接受CancellationToken(否則,例如,我可以很容易地使用ThreadPoolQueueUserWorkItem)。所以我正在尋找一種非合作取消操作的方式。

+0

爲什麼你不使用託管線程? – Candide 2012-03-12 13:07:42

+4

唯一安全的方法是通過在單獨的AppDomain中運行該代碼。 – 2012-03-12 13:11:18

+0

@HenkHolterman:你有一個如何在單獨的AppDomain中執行函數的例子嗎?我想在創建和銷燬一個新的AppDomain時會有相當多的開銷? – 2012-03-12 13:40:10

回答

3

我想說你有三種選擇。

一,將計算轉入它自己的線程。這將保持UI的響應。取而代之的是取消按鈕,只需讓用戶知道即將採取的行動無法停止一旦凝視。

二,將計算轉入它自己的線程,就像上面一樣;然而,假裝通過簡單地減少線程優先級來取消它。您可以繼續進行計算,但只需停止主線程中的報告進度即可。完成後只需扔掉結果。

三,把計算放到它自己的appdomain/process中。如果需要,請殺死該外部進程。


每個人都有好的和壞的東西。

+1

+1對孤兒線索的建議,捱餓,讓它死亡,孤獨,忽視,沒有人哀悼它,沒有悼詞,沒有墓誌銘(抽泣..) – 2012-03-12 13:41:10

+0

@MartinJames:;)一些老MötleyCrüe歌詞在這樣的情況下浮現在腦海:不要離開瘋狂,離開... – NotMe 2012-03-12 13:53:13

+0

Smilin'通過痛苦.. – 2012-03-12 16:07:47

1

呵呵?只需使用一個線程和一個工作者方法。

Thread thread = new Thread(MyWorkerMethod); 
thread.Start(); 

thread.Abort(); 


void MyWorkerMethod() { 
    // do anything you want in here 
} 
+1

首先閱讀Thread.Abort()。這被認爲是不安全的。 – 2012-03-12 13:15:04

+0

如果他使用受保護的代碼塊(例如catch-block)。在任何其他情況下都不應該有問題。或者我想念什麼? – ChrisB 2012-03-12 13:18:49

+0

它看起來像我錯過了最明顯的解決方案...... :)感謝@ChrisB指出了這一點。 – 2012-03-12 13:31:55