2016-09-21 88 views
-2

我有一個應用程序調用第三方遠程服務器。我正在使用BackgroundWorker來運行它異步。C#BackgroundWorker - 如何取消worker.CancellationPending狀態?

如果我調用CancelAsync()取消遠程進程,然後使用worker.CancellationPending狀態觸發對此遠程服務器上的Close()方法的調用,則遠程服務器會彈出一條消息「您正在嘗試要結束這個過程,那是你想要的嗎?「和是/否按鈕。

如果用戶按是,那麼沒有問題,遠程服務器關閉。但是,如果用戶按否,那麼我如何取消CancellationPending狀態,以便我的過程可以繼續,直到用戶再次調用CancelAsynch()爲止?

編輯:下面的第一個答案:我如何處理這樣一個事實,即用戶可以選擇不關閉遠程服務器,並在應用程序處於無法更改的取消狀態時保持運行狀態。

編輯:鍵盤上的武士將其標記爲重複之前,請閱讀該死的問題。

+0

到這裏看看:http://stackoverflow.com/q/4732737/3956100 – Niklas

+0

_「我怎麼處理事實上,用戶可以選擇不關閉遠程服務器「_ - 您需要將代碼中的交互重新推回以在調用CancelAsync()之前發生。這樣,您不會取消不應取消的流程。請注意,這也可以讓用戶在考慮是否要取消時繼續處理,在大多數情況下這應該是一件好事。 –

+0

@Niklas這個鏈接不是同一個問題。 –

回答

0

CancellationPending旨在設置爲true,如果已經請求取消,並且不會設置回false。這將導致不可預知的行爲:如果已經觀察到取消,那該怎麼辦?如果不行?在一種情況下,操作將被取消,而另一種情況則不會。

+0

夠公平的。那麼我該如何處理這樣的事實:用戶可以選擇不關閉遠程服務器,並在應用程序處於無法更改的取消狀態時保持運行狀態。我可以設置一個標誌來忽略CancellationPending狀態,但是用戶不能從那個blech的點上取消。 –

+0

@DaveTapson你有權訪問.Net Framework 4.5嗎? – Niklas

+0

@Niklas是的我做 –

0

作爲一般規則,您不應該在BackgroundWorker邏輯中進行用戶交互。 (出於某種原因,它被稱爲BackgroundWorker)。

請記住,CancelAsync()是異步的,所以如果您在計算過程中要求用戶交互,那麼當用戶做了完全不同的事情時,MessageBox可能會彈出幾秒/分鐘。

如果你正確隔離線程,你不應該有這樣的問題。

你應該要求用戶確認之前你叫CancelAsync()

用戶要求取消 - >您請求確認 - >調用CancelAsync()

+0

遠程服務器是第三方應用程序。我沒有把這張支票放在那裏,應用程序的開發者也這樣做了。 –

+0

既然你沒有完全控制取消過程,也許你可以避免使用'CancelAsync'?直接從UI線程調用'Close()'?或者這種服務不是線程安全的? (如果是這種情況,您可以創建一個布爾變量'_cancellationPending',在關閉按鈕上將其設置爲true,並避免使用'CancelAsync'。) –