2013-05-22 61 views
0

This is how I set up my Background Worker終止背景不同類別的工作人員

問題是:如何在中途終止該過程?我必須創建一個取消按鈕來停止當前的處理。

我想利用線下的...

if ((worker.CancellationPending == true)) 
       { 
        e.Cancel = true; 
       } 

...和封裝內AllocateTrades2方法,但是這意味着我必須調用從別的地方取消標誌,它會檢查它只在方法完成處理之後。

我不能只是假裝它沒有做任何事情,因爲如果用戶再次單擊相同的操作,就會拋出該工作人員正在使用的異常。

什麼,我想要做的一個例子:

public void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    AllocateTrades2(); 
} 
public void AllocateTrades() 
{ 
    Method1(); 
    CheckTerminate(); 

    Method2(); 
    CheckTerminate(); 

    //Click the cancel button in the UI during method 3 processing 
    Method3(); 
    CheckTerminate(); 
} 

而且CheckTerminate()停止所有的處理,使本身可用於未來的呼叫。我正在嘗試做什麼?

回答

3

你不得不做這樣的事情......

public void AllocateTrades() 
{ 
    if (!worker.CancellationPending) 
    { 
     Method1(); 
    } 

    if (!worker.CancellationPending) 
    { 
     Method2(); 
    } 

    if (!worker.CancellationPending) 
    { 
     Method3(); 
    } 
} 

淨不能決定什麼對你是相對於你的工作背景的「原子」操作,所以你必須決定如何頻率和位置檢查是否有掛起的取消。

+0

這可能是一個矯枉過正的問題(取決於項目的大小和檢查位置的數量),但這看起來像樣板和重複的代碼,我會創建一個方面並移動檢查其中的掛起取消。 –

+1

沒有完全相同的結構,但檢查每種方法的想法是相同的。 +1並被接受。 – Alexey

0

答案是

無論你支票 'CancellationPending',您可以停止你的工人

在你的榜樣,你有以下選擇:

  • 檢查在 'AllocateTrades2()' - 函數本身

    If (bw.CancellationPending) { 
        e.Cancel = True 
        return; } 
    

注:如果您在此處檢查,你可以取消進程'中途'。

  • 來自外部的檢查,你運行你的下一個進程

    If (!worker.CancellationPending) { 
        MethodX(); } 
    

一般來說,你應該檢查CancellationPending 無論它是有道理的(例如,在一個循環:後或在一個項目被處理之前)。