2010-11-30 26 views
13

HI all。 我有一個運行Worker類實例的BackgroundWorker對象數組。當我調用Worker類時,對象實例就是這樣,然後用完代碼(循環結束)。我能聽RunWorkerCompleted()事件,但是當它調用,我已經建立了委託我需要知道哪些我工人的對象剛剛完成。如何設置在RunWorkerCompletedEventArgs對象UserState?

我看到這使我委託RunWorkerCompletedEventArgs一個UserState屬性,但我不知道如何,因爲它是在完成設置這在我的Worker對象。

任何想法?從我WorkManager.cs類

片段

public Worker AddWorker() 
{ 
    Worker w = new Worker(); 

    _workers.Add(w.WorkerID,w); 

    BackgroundWorker bg = new BackgroundWorker(); 
    _bgworkers.Add(bg); 

    bg.DoWork += w.Start; 
    bg.WorkerReportsProgress = true; 
    bg.WorkerSupportsCancellation = true; 
    bg.ProgressChanged += ProcessWorkerMessage; 
    bg.RunWorkerCompleted += WorkerFinished; 


    w.WorkManager = this; 
    w.BackgroundWorker = bg; 

    bg.RunWorkerAsync(w); 


    return w; 

} 


public void WorkerFinished(object sender, RunWorkerCompletedEventArgs e) 
{ 
    if (_onManagerEvent != null) 
     _onManagerEvent(new ManagerEvent { EventDate = DateTime.Now, Message = "Worker ??? successfully ended." }); 
} 

所以,當我的Worker對象完成了循環在其開始()方法,我該怎麼辦,以填補RunWorkerCompleteEventArgs對象「E」的userState屬性,傳遞給我的WorkerFinished方法()?

感謝

回答

12

Start方法對Worker類可以設置DoWorkEventArgs參數的Result財產。這裏有一個例子:

void Start(object sender, DoWorkEventArgs e) 
{ 
    //Do your loop and other work. 
    e.Result = this; 
} 

然後在完成事件處理程序,您可以檢索e.Result:

public void WorkerFinished(object sender, RunWorkerCompletedEventArgs e) 
{ 
    //You should always check e.Cancelled and e.Error before checking e.Result! 
    // ... even though I'm skipping that here 

    Worker w = e.Result as Worker; 
    if(w != null) 
    { 
     if (_onManagerEvent != null) 
      _onManagerEvent(new ManagerEvent 
        { 
         EventDate = DateTime.Now, 
         Message = String.Format("Worker {0} successfully ended." 
               , w.ToString()) 
        }); 
    } 
} 
+0

感謝菲利普,該訣竅。關於總是檢查e.Cancelled的評論是關鍵。我實際上是通過調用BackgroundWorker對象的CancelAsync()方法來停止我的工作線程。這導致RunWorkercompletedEventArgs Result屬性沒有我的原始對象。我重構了通過在工作對象上設置一個屬性來停止工作(以線程安全的方式!),並在工人的代碼循環中檢查它。如果我看到它的信號,我只是退出循環,瞧,RunWorkercompletedEventArgs參數在e.Result中有我的對象。 – sisdog 2010-11-30 08:57:44

1

UserState件事就是BackgroundWorker一個已知的bug:

http://www.pluralsight-training.net/community/blogs/mike/archive/2005/10/21/15783.aspx(存檔。組織鏈接…原來的鏈接是死的)

我已經在過去做什麼時,我已經在你的情況是要麼使用RunWorkerCompletedEventArgs.Result(菲利普建議),或者,如果可能的話,有我的工人從BackgroundWorker(派生那麼我可以,因爲我想添加儘可能多的額外的狀態,並獲得全職工作爲發件人參數由BackgroundWorker引發的事件,同時仍然能夠使用Result達到預期目的)。