如何从当前执行的方法获取BackgroundWorker的实例?

时间:2010-07-12 21:53:47

标签: c# multithreading backgroundworker

我正在使用可以有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作为参数

谢谢: - )

5 个答案:

答案 0 :(得分:2)

BackgroundWorker.RunWorkerAsync(bw);

答案 1 :(得分:2)

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

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 :(得分:1)

您是否可以将“发件人”作为参数发送给回调,然后以这种方式进入BGW?

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

您的设计要求需要一些工作。 必须使用BackgroundWorker.UpdateProgress的方法无法将BackgroundWorker作为参数?我想,你可以修改戈登回答代理人的问题。

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