我遇到了冻结应用程序的问题。让我解释一下我的场景,我有一个服务,它对数据库进行异步调用以获取项目列表,它由任务运行。在这个任务中我有一个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();
});
}
现在Dispatcher冻结了应用程序,我试图将其更改为使用begin invoke,它也是如此。如果没有调度程序,我会收到一条错误消息,指出调用线程不是STA。我只是想在对话框窗口中显示我的消息,连接到数据库时出现问题。有人可以帮忙吗? 我在网上看了很多关于调度员的线程,但没有一个实际上显示出解决方案来解决我的问题。
谢谢
修改 调用ComboListAsync的代码
protected override void RetrieveRelatedActiveLists()
{
MyCollection = service.ComboListAsync().Result;
}
答案 0 :(得分:2)
由于调用代码使用的是.Result
。
使用service.ComboListAsync().Result
使UI线程等待此方法返回,当您从其中调用Application.Current.Dispatcher.Invoke
时,您正在向等待返回方法本身的UI线程发送消息。 / p>
您必须等待方法service.ComboListAsync()
,如下所示:
protected override async void RetrieveRelatedActiveLists()
{
MyCollection = await service.ComboListAsync();
}