2012-09-17 65 views
2

我正在開發一個使用C#4.0的WPF應用程序,其中一些用戶特定的代碼將在運行時編譯,然後在AppDomain內部執行。該過程可能需要10毫秒或5分鐘。 AppDomain將由創建Task.Factory.StartNew()。工作正常。如何取消任務而不取消CancellationToken.IsCancellationRequested?

現在我希望能夠取消/中斷執行。當代碼正在執行時,我可以按 「停止」按鈕,但如何取消該任務?我知道: 有CancellationToken.IsCancellationRequested屬性,但我不能 循環通過的東西。這就是爲什麼我在執行 (原子)代碼時無法檢查該值。並卸載AppDomain不會停止任務。

供參考:我拿任務類,因爲它易於使用。如果線程將是有用的:沒問題。

有人可以幫助我嗎?短代碼片段會很好:)。

謝謝。

+0

您正在使用System.CodeDom編譯權嗎?在開始編譯之前以及在開始加載新的AppDomain並創建代理對象之前,您可以取消。我不認爲CodeDomProvider API允許在編譯期間取消。 –

回答

0

中止一個線程或任務是一個代碼味道糟糕的設計解決方案

如果這是您的決定,您應該考慮每行代碼可能是最後一個要執行的代碼,並考慮釋放可能導致系統處於不一致狀態的任何非託管資源,鎖等。從理論上講,我們應該始終保持謹慎,但實際上這並不成立。

如果您有線程和邀請.Abort嘗試()方法,你應該考慮ThreadAbortException的try-catch最後塊進行一個特殊的例外。此外,你甚至不能確定該線程將被中止。

關於使用任務,AFAIK(我不是TPL專家),恐怕你不能做你想做的事。你應該重新設計你的邏輯來考慮取消令牌並乾淨地停止你的計算。