【发布时间】:2015-06-24 11:47:09
【问题描述】:
我遇到了应用程序冻结的问题。让我解释一下我的场景,我有一个服务,它对数据库进行异步调用以获取项目列表,它由一个任务运行。在这个任务中我有一个 try catch 块,所以它看起来像这样
public Task<List<T>> ComboListAsync(int? id = null, EnumDTO dto = EnumDTO.Default)
{
return Task.Run(() =>
{
using (var context = new ContextService())
{
try
{
return GetComboList(id, dto, context);
}
catch (Exception e)
{
Handler.DatabaseConnectionException();
throw;
}
}
});
}
然后它抛出一个异常,因为 GetComboList 它只是这个(暂时)
protected virtual List<T> GetComboList(int? id, EnumDTO dto, ContextService context)
{
throw new NotImplementedException();
}
所以调用会捕获异常并进入这里
public void Show(string message)
{
Message = message;
Application.Current.Dispatcher.Invoke(() =>
{
dialogView = new DialogView() {DataContext = this, Owner = Application.Current.MainWindow};
dialogView.ShowDialog();
});
}
现在调度程序冻结了应用程序,我尝试将其更改为使用开始调用,它也是如此。如果没有调度程序,我会收到一条错误消息,指出调用线程不是 STA。我只是想在对话框窗口中显示我的消息,即连接到数据库时出现问题。任何人都可以帮忙吗? 我在网上看了很多关于调度程序的线程,但没有一个真正显示可以解决我的问题的解决方案。
谢谢
编辑 调用 ComboListAsync 的代码
protected override void RetrieveRelatedActiveLists()
{
MyCollection = service.ComboListAsync().Result;
}
【问题讨论】:
-
如果你在
Show()方法中放置一个断点,它会被命中吗? Invoke() 内部呢?另外,你能发布调用ComboListAsnyc()和Show()的代码吗? -
必须是上面调用你的方法的一部分,它对我来说很好
-
@AndrewStephens 被选中并进入 Application.Current.Dispatcher 行,此时它返回 UI 并冻结
标签: wpf multithreading messagebox dispatcher