BackgroundWorker вернуть значение? - PullRequest
3 голосов
/ 07 марта 2011

Следующий код добавляет числа от 1 до 100 и возвращает сумму. То, что я пытаюсь сделать, это запустить вычисления в фоновом режиме и вернуть значение. Проблема в том, что returnValue возвращается до завершения DoWork. Как я могу ждать, пока мой фоновый работник завершит работу, прежде чем вернуть значение? (Кажется, я не могу поставить возврат в моем DoWork ...)

double returnValue = 0;

var b = new BackgroundWorker();
b.DoWork += new DoWorkEventHandler(
    delegate(object sender, DoWorkEventArgs e) {
        for(int i=0;i<100;i++){
            returnValue += (i+1);
        }
    }
);

b.RunWorkerAsync();
return returnValue;

Приложение: Было бы лучше отправить насос сообщений в том же потоке, чем запускать его в фоновом режиме? Кроме того, это просто пример кода, мой фактический код занимает больше минуты.

Ответы [ 4 ]

3 голосов
/ 07 марта 2011

Подписаться на событие RunWorkerCompleted.Это событие содержит возвращаемое значение фоновой операции.

Конечно, это значение будет возвращено изнутри DoWorkEventHandler, например:

b.DoWork += new DoWorkEventHandler(
    delegate(object sender, DoWorkEventArgs e) {
        double returnValue = 0;
        for(int i=0;i<100;i++){
            returnValue += (i+1);
        }
        return returnValue;
    }
);
0 голосов
/ 07 марта 2011

У меня есть пример: здесь возможно, это может помочь вам: -)

Кроме того, это просто пример кода, мой фактический код занимает больше минутызавершено.

это может быть эффектом асинхронного запуска.Вы можете сказать фоновщику, когда начинать, или просто сказать старт.если вы явно не говорите, что он должен начать СЕЙЧАС, он начинает, когда c # считает, что сейчас самое время начать: -)

0 голосов
/ 07 марта 2011

Вы пытаетесь выполнить синхронную операцию с BackgroundWorker, которая BAD . Но если вам нужно, вы можете использовать флаг IsBusy.

double returnValue = 0;

var b = new BackgroundWorker();
b.DoWork += new DoWorkEventHandler(
    delegate(object sender, DoWorkEventArgs e) {
        for(int i=0;i<100;i++){
            returnValue += (i+1);
        }
    }
);

b.RunWorkerAsync();
while(b.IsBusy){
  Application.DoEvents();
}
return returnValue;
0 голосов
/ 07 марта 2011

Я не вижу здесь вопроса, но я думаю, что вы ищете, это событие под названием RunWorkerCompleted. Это поднимается после завершения делегата DoWork. Если это не то, что вы ищете, я думаю, вам нужно перефразировать ваш вопрос.

...