Если пользователь выполняет операцию, например удаление элементов, он сразу удаляет их из пользовательского интерфейса, а затем удаляет их из базы данных в фоновом потоке с помощью TPL. Проблема заключается в том, что пользователь выходит из приложения до завершения фонового потока, элемент никогда не удаляется.
Есть ли стандартный способ ожидания завершения операций асинхронного доступа до закрытия приложения?
Мои асинхронные вызовы выглядят следующим образом:
if (MyObjectList.Contains(obj)) MyObjectList.Remove(obj);
Task.Factory.StartNew(() => DAL<MyEntities>.DeleteObject(obj));
Обновление
Вот последний код, с которым я пошел. Я очень рад видеть, что это работает так, как должно, хотя дайте мне знать, смогу ли я его улучшить. Мне еще многое предстоит узнать:)
public partial class App : Application
{
private List<Task> _backgroundTasks = new List<Task>();
public App()
{
EventSystem.Subscribe<TaskStartedMessage>((e) =>
{
_backgroundTasks.Add(e.Task);
});
EventSystem.Subscribe<TaskEndedMessage>((e) =>
{
if (_backgroundTasks.Contains(e.Task))
_backgroundTasks.Remove(e.Task);
});
}
protected override void OnExit(ExitEventArgs e)
{
Task.WaitAll(_backgroundTasks.Where(p => !p.IsCompleted).ToArray(), 30000);
base.OnExit(e);
}
}
И при запуске важной фоновой задачи я использую этот синтаксис:
var task = Task.Factory.StartNew(() => DAL<MyEntities>.DeleteObject(obj));
EventSystem.Publish<TaskStartedMessage>(new TaskStartedMessage(task));
await task;
EventSystem.Publish<TaskEndedMessage>(new TaskEndedMessage(task));
Я использую AsyncCTP для await
/async
и Microsoft Prism EventAggregator
для системы событий.