Как мне дождаться завершения моих асинхронных операций после выхода из приложения с помощью?

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

12
задан Rachel 23 December 2011 в 14:44
поделиться