Подтвердить что ты не робот

Как заставить BackgroundWorker возвращать объект

Мне нужно сделать RunWorkerAsync() return a List<FileInfo>. Как я могу вернуть объект из рабочего фона?

4b9b3361

Ответ 1

В вашем обработчике событий DoWork для BackgroundWorker (где выполняется фоновая работа) есть аргумент DoWorkEventArgs. Этот объект имеет объект public public Result. Когда ваш работник сгенерировал свой результат (в вашем случае a List<FileInfo>), установите для него e.Result и верните.

Теперь, когда ваш BackgroundWorker выполнил свою задачу, он вызывает событие RunWorkerCompleted, в котором объект RunWorkerCompletedEventArgs является аргументом. RunWorkerCompletedEventArgs.Result будет содержать результат из вашего BackgroundWorker.

Пример:

private void bgw_DoWork(object sender, DoWorkEventArgs e)
{
    int result = 2+2;
    e.Result = result;
}

private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    int result = (int)e.Result;
    MessageBox.Show("Result received: " + result.ToString());
}

Ответ 2

Я предполагаю, что вы не хотите блокировать и ждать RunWorkerAsync() для результатов (если вы это сделали, не было бы причин запускать async!

Если вы хотите получать уведомления о завершении фонового процесса, подключите событие RunWorkerCompleted. Если вы хотите вернуть какое-то состояние, верните его в член Result аргументов DoWork.

РЕДАКТИРОВАТЬ: Я опубликовал преждевременно - закончил мой пример кода

Пример:



    private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
      // do your thing
      ....
      // return results
      e.Result = theResultObject;
    }

    // now get your results
    private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
      MyResultObject result = (MyResultObject)e.Result;
      // process your result...
    }


Ответ 3

RunWorkerAsync() запускает процесс асинхронно и возвратит и продолжит выполнение вашего кода до завершения процесса. Если вы хотите получить результат BackgroundWorker, вам нужно создать переменную экземпляра, чтобы сохранить это значение и проверить его после завершения BackgroundWorker.

Если вы хотите дождаться завершения работы, вам не понадобится BackgroundWorker.

Ответ 4

Вы могли бы связать ваш поток с объектом в качестве аргумента:

ThreadFinishedEvent(this, new ThreadEventArgs(object));

где:

public class ThreadEventArgs : EventArgs
{
    public ThreadEventArgs(object object)
    {
        Object = object
    }

    public object Object
    {
        get; private set;
    }
}

Ответ 5

В зависимости от вашей модели вы либо хотите, чтобы ваш рабочий поток обратился к своему создателю (или к какому-либо другому процессу), когда он закончил свою работу, или вам нужно периодически опросить рабочий поток, чтобы убедиться, что это сделано и, если да, получите результат.

Идея ждать, пока рабочий поток вернет свой результат, подрывает преимущества многопоточности.

Ответ 6

Вообще говоря, при запуске процесса async рабочий поток должен вызывать делегат или запускать событие (например, ChrisF).

Вы можете проверить новый PFX, у которого есть функция concurrency, которая может возвращать значения.

Например, существует функция Parallel.ForEach(), которая имеет перегрузку, которая может возвращать значение.

проверьте это для получения дополнительной информации

http://msdn.microsoft.com/en-us/magazine/cc817396.aspx