应用程序调度程序调用冻结应用程序
Application dispatcher invoke freezes the application
我遇到应用程序冻结问题。让我解释一下我的场景,我有一个服务,它对数据库进行异步调用以获取项目列表,任务是 运行。在这个任务中,我有一个 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。我只是想在对话框 window 中显示我的消息,即连接到数据库时出现问题。谁能帮忙?
我在网上看了很多关于调度程序的话题,但 none 实际上显示了一个可以解决我的问题的解决方案。
谢谢
编辑
调用 ComboListAsync
的代码
protected override void RetrieveRelatedActiveLists()
{
MyCollection = service.ComboListAsync().Result;
}
这是一个死锁,因为调用代码正在使用 .Result
。
使用 service.ComboListAsync().Result
使 UI 线程等待此方法到 return,当您从其中调用 Application.Current.Dispatcher.Invoke
时,您正在向 UI 正在等待方法本身的 return 的线程。
您必须像这样等待方法service.ComboListAsync()
:
protected override async void RetrieveRelatedActiveLists()
{
MyCollection = await service.ComboListAsync();
}
我遇到应用程序冻结问题。让我解释一下我的场景,我有一个服务,它对数据库进行异步调用以获取项目列表,任务是 运行。在这个任务中,我有一个 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。我只是想在对话框 window 中显示我的消息,即连接到数据库时出现问题。谁能帮忙? 我在网上看了很多关于调度程序的话题,但 none 实际上显示了一个可以解决我的问题的解决方案。
谢谢
编辑 调用 ComboListAsync
的代码 protected override void RetrieveRelatedActiveLists()
{
MyCollection = service.ComboListAsync().Result;
}
这是一个死锁,因为调用代码正在使用 .Result
。
使用 service.ComboListAsync().Result
使 UI 线程等待此方法到 return,当您从其中调用 Application.Current.Dispatcher.Invoke
时,您正在向 UI 正在等待方法本身的 return 的线程。
您必须像这样等待方法service.ComboListAsync()
:
protected override async void RetrieveRelatedActiveLists()
{
MyCollection = await service.ComboListAsync();
}