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

Я новичок в d3 и JavaScript, но я нашел обходной путь, чтобы найти минимальную и максимальную значения трех строк с объектами, используя d3.extent и .concat:

y.domain(
  d3.extent(
    d3.extent(data, function(d) {
      return d.line1;     })
    .concat(d3.extent(data, function(d) {
      return d.line2;     })
            .concat(d3.extent(data, function(d) {
      return d.line3;     })
                   ))
  ));
54
задан Welbog 2 June 2009 в 02:47
поделиться

6 ответов

В обработчике событий DoWork для BackgroundWorker (где выполняется фоновая работа ) есть аргумент DoWorkEventArgs . Этот объект имеет объект общедоступного свойства Result. Когда ваш рабочий сгенерировал свой результат (в вашем случае, List ), установите 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());
}
92
ответ дан 7 November 2019 в 07:53
поделиться

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

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

1
ответ дан 7 November 2019 в 07:53
поделиться

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

ThreadFinishedEvent(this, new ThreadEventArgs(object));

где:

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

    public object Object
    {
        get; private set;
    }
}
1
ответ дан 7 November 2019 в 07:53
поделиться

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

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

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

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

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

0
ответ дан 7 November 2019 в 07:53
поделиться

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

0
ответ дан 7 November 2019 в 07:53
поделиться

Я предполагаю, что вы не хотите блокировать и ждать результатов 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...
    }


20
ответ дан 7 November 2019 в 07:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: