Как ожидать правильно, пока BackgroundWorker не завершается?

Я использую то, что необходимо для communicatation. Обычно это - ничто вообще. Иногда это - электронная доска.

Время от времени, я использую Архитектор Sparx Enterprise , который является UML , моделируя инструмент, хотя он производит достойный diagams, в то время как это в нем. Я использовал его для требований, варианта использования, действия, последовательности, домена, и даже моделирования класса и иногда некоторых перепроектированных схем ER. Любой ценой понять через.

37
задан abatishchev 6 March 2012 в 14:46
поделиться

3 ответа

Попробуйте использовать класс AutoResetEvent следующим образом:

var doneEvent = new AutoResetEvent(false);
var bw = new BackgroundWorker();

bw.DoWork += (sender, e) =>
{
  try
  {
    if (!e.Cancel)
    {
      // Do work
    }
  }
  finally
  {
    doneEvent.Set();
  }
};

bw.RunWorkerAsync();
doneEvent.WaitOne();

Внимание: Вы должны убедиться, что doneEvent.Set () вызывается независимо от того, что происходит. Также вы можете предоставить doneEvent.WaitOne () аргумент, определяющий период ожидания.

Примечание: Этот код в значительной степени является копией Fredrik Kalseth ответьте на аналогичный вопрос .

44
ответ дан 27 November 2019 в 04:33
поделиться

BackgroundWorker имеет событие завершения. Вместо ожидания вызовите оставшийся путь кода из обработчика завершения.

7
ответ дан 27 November 2019 в 04:33
поделиться

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

var handler = GetTheRightHandler();
var bw = new BackgroundWorker();
bw.RunWorkerCompleted += (sender, args) =>
{
  OnAsyncOperationCompleted(sender, args);
});
bw.DoWork += OnDoWorkLoadChildren;
bw.RunWorkerAsync(handler);

Timer Clock=new Timer();
Clock.Interval=1000;
Clock.Start();
Clock.Tick+=new EventHandler(Timer_Tick);

public void Timer_Tick(object sender,EventArgs eArgs)
{   
    if (bw.WorkerSupportsCancellation == true)
    {
        bw.CancelAsync();
    }

    throw new TimedoutException("bla bla bla");
 }

В OnDoWorkLoadChildren:

if ((worker.CancellationPending == true))
{
    e.Cancel = true;
    //return or something
}
0
ответ дан 27 November 2019 в 04:33
поделиться
Другие вопросы по тегам:

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