【发布时间】:2015-12-29 04:18:40
【问题描述】:
我的 WPF 窗口有一个奇怪的行为。总而言之,我有一个 WPF 窗口,它对加载的事件执行异步操作
if (AppContext.OnlineMode)
Task.Run(() => SynchronizeMails());
这个函数(synchronizeMails),做了很多事情(异步联系webservice,插入数据库,刷新GUI,......),第一次启动时,它需要很长时间。
我有一个按钮,允许用户断开连接,绑定到根据当前状态显示消息框的命令。就我而言,synchronizeMails 将 bool 设置为 true,以防止多次同步并防止在处理期间退出。我的命令实现查看这个布尔值,如果当前正在同步,则显示一个消息框。
ExitCommand = new RelayCommand(p => Task.Run(() =>
{
RestartAsked = true;
if (Synchronizing)
{
OpeningView.ShowWarning("...");
}
});
出于风格原因,我们在自己的实现中重新编码了消息框,因此对 messageBox ShowWarning 的调用只是主 GUI 上的一个 ShowDialog,没有异步/等待的东西。
奇怪的是:当用户在此消息框上单击“确定”时,我的异步方法停止工作,执行 finaly 块(整个方法在 try-finally 块中以禁用我的布尔值,如果有一些错误) ,当然,这项工作还没有完成。
我不明白为什么带有 return 的 showDialog 让我的异步方法停止...
有人有想法吗?
【问题讨论】:
-
您的 SyncronizeMails 方法中是否设置了布尔值?在调用方法之前尝试将 bool 设置为 true。
-
是的,但是移动它不会改变任何东西
-
您的
SynchronizeMails方法中似乎抛出了一些异常。尝试将catch(){;}放在 finally 块之前,可能会发生一些 InvalidOperation 或 SynchronizeContext 的事情。 -
这是我的第一个想法,但不,没有抛出异常。我在方法末尾的最后一条指令上放了一个断点,单击“确定”后,我的断点触发,而我在方法中的异步内容尚未完成...
-
我发现这是因为我的异步内容位于 Parallel.For 和 Parallel.ForEach 中,这使它在结束之前返回...通过 for 更改 Parallel.For 和通过 foreach 更改 Parallel.ForEach让它工作。但是,我不知道如何并行化作业,因为它现在让它变慢了!
标签: c# .net wpf async-await relaycommand