2013-04-11 62 views
2

短版即使有異常傳遞給BackgroundWorker的訪問參數?

如何訪問在RunWorkerCompleted事件傳遞給BackgroundWorker的說法,如果有異常長大的嗎?

更長版本

我使用我的應用程序BackgroundWorker組件。在應用程序啓動時,我查詢數據庫以獲取未發送的消息列表。然後使用GSM調制解調器(內部後臺工作人員),我一個接一個地發送消息。

現在只要我決定發送消息,我將它添加到名爲CurrentlyHandledMessages的列表中。這確保2個調制解調器不會發送相同的消息。

現在我將消息傳遞給所述BackgroundWorker作爲參數的ID,並將其發送的消息,並且RunWorkerCompleted事件引發和我從CurrentlyHandledMessages刪除ID列表。我將結果作爲Tuple傳遞。

e.Result = new Tuple<int, String>(idToHandle, response); 

這工作正常,如果沒有例外。

但是,如果發生異常,我無法看到如何將參數傳遞給BackgroundWorker。因爲在RunWorkerCompleted事件中,我想刪除該ID,無論如何。

回答

2

沒有內置的方式來獲取已傳遞的參數(在本例中爲ID)。你需要自己傳遞它。我會建議只是傳遞這一切的時候,而不考慮的異常,所以想象這樣的事情DoWork處理器內部:

string response; 

try 
{ 
    ... 

    response = "something"; 
} 
catch (Exception ex) 
{ 
    response = e.ToString(); 
} 
finally 
{ 
    e.Result = new Tuple<int, string>((int)e.Argument, response); 
} 

,因此現在,不管結果如何,你會得到那個ID進入RunWorkerCompleted處理程序。

+0

如果我發現異常並且不重新拋出異常,它是否仍然可以在RunWorkerCompleted事件的'e.Error'中使用? – 2013-04-11 03:14:23

+0

@RanhiruCooray,很好的問題,我不知道,但也可以重新拋出它。讓所有其他事情都一樣,重新拋出,因爲這仍然會打到最後。 – 2013-04-11 03:40:56

1
private void bgw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    try 
    { 
     // do the work 
    } 
    catch (Exception ex) // on error 
    { 
     e.Error = ex; 
     e.Result = "set the data here"; 
    } 
} 

在完成事件

檢查e.Error第一,然後e.Cancelled,最後e.Result

0

根據MSDN

你RunWorkerCompleted事件處理程序應經常檢查 AsyncCompletedEventArgs.Error和訪問之前AsyncCompletedEventArgs.Cancelled 性質RunWorkerCompletedEventArgs.Result 屬性。如果發生異常或操作被取消,則訪問RunWorkerCompletedEventArgs 。結果屬性引發了一個 異常。

0

從BackgroundWorker的只是派生和實施所需的屬性:

public class CustomBackgroundWorker : BackgroundWorker 
{ 
    public object Argument { get; private set; } 

    protected override void OnDoWork(DoWorkEventArgs e) 
    { 
     Argument = e.Argument; 
     base.OnDoWork(e); 
    } 
} 

然後從RunWorkerCopmleted和其他活動訪問如下:

private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    object originalArgument = ((CustomBackgroundWorker)sender).Argument; 

    // The rest of the stuff 
    if (e.Cancelled) { ... } 
    if (e.Error) {...} 
    ... 
} 

處理語義錯誤原封不動