Если пользователь выполняет операцию, такую как удаление элементов, он сразу удаляет их из пользовательского интерфейса, а затем удаляет их из базы данных в фоновом потоке, используя 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
для системы событий.