2012-04-25 54 views
0

我有一個WPF應用程序,做了很多跟一個遠程服務器的,所以要保持界面很好,響應速度很快,我把這些操作放在第二個線程中。有一些可能的但不太可能的情況,那個線程只會掛起,永遠阻塞。有沒有簡單的方法讓我實現一個「取消」按鈕,不涉及調用thread.Abort()?我看到很多人建議不要使用它,而且我不想留下任何未發佈的資源。也許一種強制線程拋出異常的方法?什麼是實行「停止/取消」按鈕來停止一個線程的好方法(即ins't後臺工作)

我在標題中註明,這不是後臺工作,因爲程序不使用這些。它已經用普通的舊線程編碼了。

+2

如果您不希望線程掛起,請修復這些情況,以免發生這種情況。 – 2012-04-25 07:19:50

+1

什麼情況下,「只是掛起,永遠阻止」?修復這些! – 2012-04-25 07:21:12

+0

@DavidSchwartz如果程序本身無法確定是否出現問題,那麼需要用戶做出決定。此外,在其他情況下,當程序需要停止線程本身(如連接錯誤,它需要重新建立連接並重新啓動線程)我想用同樣的取消方法 – cost 2012-04-25 07:24:48

回答

0

我絕對是你需要解決什麼地方不對頭意見同意,因爲這是真正的問題,但如果你不能在此刻,並且需要繼續工作。如果您使用的是.NET 4.0,請使用任務庫。您可以創建一個任務並向其傳遞一個將在另一個線程上執行的操作。關鍵是您可以將取消令牌傳遞給該任務。

http://msdn.microsoft.com/en-us/library/dd997396.aspx

如果你一遍又一遍火一樣的動作,你也可以檢查任務的狀態,併爲此做些什麼。

//this is just a sample 
if (myTask != null) //meaning it's still exe'ing your action 
{ 
    if (myTask.Status == TaskStatus.Faulted) //there's some kind of a problem with exe'ing it 
    myTask = null; // could reset to run the action again 
    else 
     return; //let the task finish 
} 

myTask = Task.Factory.StartNew (() => 
     { 
      ExecuteUMyAction(); 
     });