Причина фонового работника не ясна.
Тем не менее, вы можете сделать следующее (при условии, что нет законных async
операций ввода-вывода , и эти задачи не нужно запускать из Резьба пула ).
Примечание : если бы была допустимая async
работа ввода-вывода, вам не нужно было бы переносить / выгружать в Task
и просто использовать await
)
Преимущества:
- Его последовательный
- Его факторы проще (меньше степеней свободы)
- Его легче читать
- Он использует Асинхронный шаблон ожидания (и освобождает насос сообщений / Поток пользовательского интерфейса )
- И будет хорошо работать с обновлениями пользовательского интерфейса
Пример
private async void btnStartAsyncOperation_Click(object sender, EventArgs e)
{
try
{
await Task.Run(() => FirstTask1());
// update the ui
await Task.Run(() => FirstTask2());
// update the ui
await Task.Run(() => FirstTask3());
// update the ui
}
catch (Exception exception)
{
// make sure you catch or do something with exception
}
}
Примечание : поскольку это event
и async void
подходит, вам необходимо убедиться, что вы справляетесь со своими исключениями (поскольку это не наблюдается).Вы также можете защитить себя от двойного щелчка