应用程序调度程序调用冻结应用程序

时间:2015-06-24 11:47:10

标签: wpf multithreading messagebox dispatcher

我遇到了冻结应用程序的问题。让我解释一下我的场景,我有一个服务,它对数据库进行异步调用以获取项目列表,它由任务运行。在这个任务中我有一个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;
    }

1 个答案:

答案 0 :(得分:2)

由于调用代码使用的是.Result

,因此死锁

使用service.ComboListAsync().Result使UI线程等待此方法返回,当您从其中调用Application.Current.Dispatcher.Invoke时,您正在向等待返回方法本身的UI线程发送消息。 / p>

您必须等待方法service.ComboListAsync(),如下所示:

  protected override async void RetrieveRelatedActiveLists()
  {
      MyCollection = await service.ComboListAsync();
  }