Как и многие другие приложения, я хочу обновить текст своего статуса, когда приложение выполняет длительные вычисления. Я читал статьи о Dispatcher и BackgroundWorker. Я знаю, что мне обязательно нужно убедиться, что обновления происходят в потоке пользовательского интерфейса. Моя первая попытка была:
MyView.UpdateStatus( "Please wait" );
LongComputation();
MyView.UpdateStatus( "Ready" );
Это не работает, потому что (я думаю) LongComputation предотвращает обновление статуса.
Итак, я попытался сделать это:
BackgroundWorker worker = new BackgroundWorker();
MyView.UpdateStatus( "Please wait");
worker.DoWork += delegate(object s, DoWorkEventArgs args)
{
LongComputation();
}
worker.RunWorkerAsync();
MyView.UpdateStatus( "Ready" );
Я надеялся, что дополнительный поток даст UpdateStatus возможность обновить текст статуса. Тоже не работает. Одна из причин заключается в том, что результат LongComputation отображается в форме Windows. Как только я помещаю LongComputation в BackgroundWorker, результат не отображается.
Итак, я попробовал в третий раз, используя текущий код:
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += delegate(object s, DoWorkEventArgs args)
{
Dispatcher.Invoke(((Action)(() => Status.Text = args.Argument as string)));
};
worker.RunWorkerAsync(newStatus);
Я надеялся, что размещение обновления в другом потоке сработает. Но этого не произошло.
Что я могу сделать, чтобы убедиться, что статус отражает правильное состояние программы?