Как я могу получить экземпляр BackgroundWorker из выполняемого в настоящее время метода? - PullRequest
3 голосов
/ 13 июля 2010

Я использую фоновый работник, который может иметь 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 ]

2 голосов
/ 13 июля 2010

Насколько я знаю, лучшее, что вы могли бы избежать при использовании фонового работника (с учетом констант, о которых вы упомянули):

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 голосов
/ 13 июля 2010
BackgroundWorker.RunWorkerAsync(bw);
1 голос
/ 13 июля 2010

Ваши требования к дизайну нужно немного поработать.Метод, который должен использовать BackgroundWorker.UpdateProgress, не может принять BackgroundWorker в качестве параметра?Вы могли бы изменить ответ Гордона, чтобы вместо него принять делегата, я полагаю.

Если вы хотите такого рода разделения интересов, то вы, вероятно, будете намного счастливее, используя Taskбиблиотека в 4.0.Они отделяют работу, которую необходимо выполнить (код «обновления»), от планирования этой работы.

1 голос
/ 13 июля 2010

Вы хотите использовать метод RunWorkerAsync , который принимает аргумент, который затем доступен как свойство Аргумент параметра события.

Затем можно передатьэкземпляр BackgroundWorker для фонового метода.

1 голос
/ 13 июля 2010

Не могли бы вы просто отправить "отправителя" в качестве параметра для обратного вызова и таким образом добраться до BGW?

...