如何在RunWorkerCompletedEventArgs对象中设置UserState?

sis*_*dog 13 c# backgroundworker

大家好.我有一组运行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." });
}
Run Code Online (Sandbox Code Playgroud)

因此,当我的Worker对象在其Start()方法中完成循环时,我该怎么做才能填充传递给我的WorkerFinished方法()的RunWorkerCompleteEventArgs对象"e"的userState属性?

谢谢

Phi*_*eck 13

StartWorker类上的方法可以设置参数的Result属性DoWorkEventArgs.这是一个例子:

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

然后在完成事件处理程序中,您可以检索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()) 
                    });
    }
}
Run Code Online (Sandbox Code Playgroud)