在我的Windows窗體應用程序中,我需要調用第三方數學庫(Accord.NET)的長時間運行操作。在計算過程中,我希望保持GUI響應,並且讓用戶可以取消長時間運行。非合作取消異步操作
有沒有辦法在後臺線程中執行該函數,並給予用戶取消它的可能性?請注意,我想調用的長時間運行函數位於外部庫中,並且不接受CancellationToken
(否則,例如,我可以很容易地使用ThreadPool
的QueueUserWorkItem
)。所以我正在尋找一種非合作取消操作的方式。
在我的Windows窗體應用程序中,我需要調用第三方數學庫(Accord.NET)的長時間運行操作。在計算過程中,我希望保持GUI響應,並且讓用戶可以取消長時間運行。非合作取消異步操作
有沒有辦法在後臺線程中執行該函數,並給予用戶取消它的可能性?請注意,我想調用的長時間運行函數位於外部庫中,並且不接受CancellationToken
(否則,例如,我可以很容易地使用ThreadPool
的QueueUserWorkItem
)。所以我正在尋找一種非合作取消操作的方式。
我想說你有三種選擇。
一,將計算轉入它自己的線程。這將保持UI的響應。取而代之的是取消按鈕,只需讓用戶知道即將採取的行動無法停止一旦凝視。
二,將計算轉入它自己的線程,就像上面一樣;然而,假裝通過簡單地減少線程優先級來取消它。您可以繼續進行計算,但只需停止主線程中的報告進度即可。完成後只需扔掉結果。
三,把計算放到它自己的appdomain/process中。如果需要,請殺死該外部進程。
每個人都有好的和壞的東西。
+1對孤兒線索的建議,捱餓,讓它死亡,孤獨,忽視,沒有人哀悼它,沒有悼詞,沒有墓誌銘(抽泣..) – 2012-03-12 13:41:10
@MartinJames:;)一些老MötleyCrüe歌詞在這樣的情況下浮現在腦海:不要離開瘋狂,離開... – NotMe 2012-03-12 13:53:13
Smilin'通過痛苦.. – 2012-03-12 16:07:47
呵呵?只需使用一個線程和一個工作者方法。
Thread thread = new Thread(MyWorkerMethod);
thread.Start();
thread.Abort();
void MyWorkerMethod() {
// do anything you want in here
}
首先閱讀Thread.Abort()。這被認爲是不安全的。 – 2012-03-12 13:15:04
如果他使用受保護的代碼塊(例如catch-block)。在任何其他情況下都不應該有問題。或者我想念什麼? – ChrisB 2012-03-12 13:18:49
它看起來像我錯過了最明顯的解決方案...... :)感謝@ChrisB指出了這一點。 – 2012-03-12 13:31:55
爲什麼你不使用託管線程? – Candide 2012-03-12 13:07:42
唯一安全的方法是通過在單獨的AppDomain中運行該代碼。 – 2012-03-12 13:11:18
@HenkHolterman:你有一個如何在單獨的AppDomain中執行函數的例子嗎?我想在創建和銷燬一個新的AppDomain時會有相當多的開銷? – 2012-03-12 13:40:10