c# - 如何在 RunWorkerCompletedEventArgs 对象中设置 UserState?

标签 c# backgroundworker

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

我在委托(delegate)的 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()) 
                    });
    }
}

关于c# - 如何在 RunWorkerCompletedEventArgs 对象中设置 UserState?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4310166/

相关文章:

c# - 为什么代码分析器建议处理 IDisposable 字段?

c# - WPF 将复选框绑定(bind)到 bool?

c# - list <T> : Clear; AddRange; Add; Delete; ect. 。导致 System.IndexOutOfRangeException

c# - 后台 worker 从不同的类更新(最好通过事件)

c# - 将一个代码隐藏页面中使用的方法重用到另一个代码隐藏页面

c# - TFS API 是否需要 Visual Studio?

c# - 在没有 WinForm 控件的情况下在主线程上调用一个方法来调用 Invoke 或 BeginInvoke

c# - 我如何将 "Thread.Join"设置为 BackgroundWorker?

f# - 编写轮询 Windows 服务

.net - BackgroundWorker 类如何在 UI 线程上触发其事件?