如何在RunWorkerCompletedEventArgs对象中设置UserState?

大家好。 我有一组运行Worker类实例的BackgroundWorker对象。 当我调用Worker类时,对象实例会执行它然后用尽代码(循环结束)。 我能够收听RunWorkerCompleted()事件,但是当它调用我设置的委托时,我需要知道我的哪些Worker对象刚刚完成。

我在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对象在其Start()方法中完成循环时,我该怎么做才能填充传递给我的WorkerFinished方法()的RunWorkerCompleteEventArgs对象“e”的userState属性?

谢谢

Worker类上的Start方法可以设置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()) }); } } 

UserStateUserState的一个已知错误:

http://www.pluralsight-training.net/community/blogs/mike/archive/2005/10/21/15783.aspx(archive.org链接…原始链接已死)

在我遇到你的情况时我过去所做的就是使用RunWorkerCompletedEventArgs.Result (正如菲利普所建议的那样),或者,如果可能的话,让我的工作人员从BackgroundWorker派生(然后我可以添加尽可能多的额外状态想要,并将整个worker作为BackgroundWorker引发的事件的sender参数,同时仍然能够将Result用于其预期目的)。