【问题标题】:How can i get the instance of a BackgroundWorker from the currently executed method?如何从当前执行的方法中获取 BackgroundWorker 的实例?
【发布时间】:2010-07-12 21:53:47
【问题描述】:

我正在使用一个可以有 n 个实例的后台工作程序。问题是 DoWork 方法(具有“sender”参数,即 BackgroundWorker)调用其他产生回调的代码 - 因此我没有发送者。

如何确定当前代码运行的 BackgroundWorker?

例如:

private void SetupThread()
{
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += new DoWorkEventHandler(DoTheWork);
}


private void DoTheWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{

    // I know that sender here can be converted, but thats no good for me
    MyClass.DoSomething(); // This will produce a callback(event) from MyClass
}

private void MethodCalledFromEventCallback()
{
   // Here is where the actual work is being done.  I need to determine which
   // instance of the Backgroundworker is calling it so that i can use the         
   // UpdateProgress method

  // I cannot do this :-(  (BackgroundWorker)System.Threading.Thread.CurrentThread;

}

我可能只是忽略了一些东西(除非线程池是有序的:-()

我确定这可以通过 BackgroundWorker 轻松实现...有什么想法吗?


编辑

我的描述引起了一些混乱,这里有更多事实:-) 1.) 我已经调用了 bw.RunWorkerAsync() 2.) 调用事件 MethodCalledFromEventCallback 的类不知道后台线程 3.) 我不能(由于设计要求)将 Backgroundworker 包含为参数

谢谢:-)

【问题讨论】:

    标签: c# multithreading backgroundworker


    【解决方案1】:

    据我所知,使用后台工作人员可能最好的办法是(假设您到目前为止提到的限制):

    private void SetupThread()
    {
        BackgroundWorker bw = new BackgroundWorker();
        // Assuming you need sender and e. If not, you can just send bw
        bw.DoWork += new DoWorkEventHandler(DoTheWork);
    }
    
    private void DoTheWork(object sender, System.ComponentModel.DoWorkEventArgs e)
    {
        MyClass.Callback = () => 
            {
                ((BackgroundWorker)bw).UpdateProgress(/*send your update here*/);
                MethodCalledFromEventCallback();
            };
    
        MyClass.DoSomething(); // This will produce a callback(event) from MyClass
    }
    
    private void MethodCalledFromEventCallback() 
    { 
        // You've already sent an update by this point, so no background parameter required
    }
    

    【讨论】:

      【解决方案2】:
      BackgroundWorker.RunWorkerAsync(bw);
      

      【讨论】:

      • 实际执行工作的最后一个块来自一个类的事件,它不知道BackgrounWorker :-(
      【解决方案3】:

      您能否将“发送者”作为参数发送到回调,然后以这种方式到达 BGW?

      【讨论】:

        【解决方案4】:

        您想使用带有参数的RunWorkerAsync 方法,然后该参数可用作事件参数的Argument 属性。

        然后您可以将 BackgroundWorker 实例传递给后台方法。

        【讨论】:

          【解决方案5】:

          您的设计要求需要做一些工作。 必须使用BackgroundWorker.UpdateProgress的方法不能将BackgroundWorker作为参数?我想您可以修改 Gordon 的答案以接受代表。

          如果您想要这种关注点分离,那么使用 4.0 中的 Task 库可能会更快乐。他们将要完成的工作(“更新”代码)与该工作的调度分开。

          【讨论】:

            猜你喜欢
            • 2010-10-01
            • 1970-01-01
            • 2013-02-03
            • 1970-01-01
            • 2011-12-22
            • 1970-01-01
            • 2013-08-06
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多