如果用户执行了某个操作(比如删除项目),则会立即从UI中删除该项目,并在后台线程中使用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
作为事件系统。
Task.WaitAll()
方法。 - Rachel