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

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();
  }