Я пытаюсь использовать Background Worker в приложении WPF. Тяжелая задача использует WebClient для загрузки HTML-кода и анализа некоторой информации из него. В идеале я хочу делать это, загружая и анализируя, не блокируя пользовательский интерфейс и не помещая результаты в пользовательский интерфейс, как только он заработает.
И все работает нормально, однако, если я быстро отправлю команду «загрузить и проанализировать», я получу ошибку:
Этот BackgroundWorker в настоящее время занят и не может выполнять несколько задач
одновременно
Итак, я немного прогуглил, и похоже, что я могу включить свойство .WorkerSupportsCancellation
фонового рабочего и просто .CancelAsync()
. Однако это не работает должным образом (отмена текущей загрузки и анализ).
Я все еще получаю вышеуказанную ошибку.
Вот мой код:
//In window constructor.
_backgroundWorker.WorkerSupportsCancellation = true;
_backgroundWorker.DoWork += new DoWorkEventHandler(_backgroundWorker_DoWork);
_backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(_backgroundWorker_RunWorkerCompleted);
//Declared at class level variable.
BackgroundWorker _backgroundWorker = new BackgroundWorker();
//This is the method I call from my UI.
private void LoadHtmlAndParse(string foobar)
{
//Cancel whatever it is you're doing!
_backgroundWorker.CancelAsync();
//And start doing this immediately!
_backgroundWorker.RunWorkerAsync(foobar);
}
POCOClassFoo foo = new POCOClassFoo();
void _backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//This automagically sets the UI to the data.
Foo.DataContext = foo;
}
void _backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
//DOING THE HEAVY LIFTING HERE!
foo = parseanddownloadresult()!
}