【问题标题】:Await async does not work correctly [duplicate]等待异步无法正常工作[重复]
【发布时间】:2018-01-13 04:13:22
【问题描述】:

我有一个使用 API 数据的表单。从服务器获取数据时,表单被阻止。我尝试使用异步等待和任务,但它没有帮助。无论如何,表格被阻止了。你能解释一下我如何在我的应用程序中应用异步等待吗?

我使用的代码:

private void navigationTreeView_AfterSelect(object sender, TreeViewEventArgs e)
{
    Task task = SwitchToProjectsPanelAsync();
    task.Wait();
}

private async Task SwitchToProjectsPanelAsync()
{
    CurrentPanel.Visible = false;

    if (MyAllProjectsFlowLayoutPanel == null)
    {
        MyAllProjectsFlowLayoutPanel = new MyAllProjectsFlowLayoutPanel(this);
        MyAllProjectsFlowLayoutPanel.SuspendLayout();
        this.Controls.Add(MyAllProjectsFlowLayoutPanel);
        MyAllProjectsFlowLayoutPanel.AllProjects = _controller.GetProjectsList();

        MyAllProjectsFlowLayoutPanel.ShowProjectsList();
        CurrentPanel = MyAllProjectsFlowLayoutPanel;
        CurrentPanel.Visible = true;
        MyAllProjectsFlowLayoutPanel.ResumeLayout(false);
        MyAllProjectsFlowLayoutPanel.PerformLayout();
    }
    else
    {
        CurrentPanel = MyAllProjectsFlowLayoutPanel;
        CurrentPanel.Visible = true;
    }
}

完整代码在 Git https://github.com/ViktorKuryshev/CRM

【问题讨论】:

标签: c# async-await


【解决方案1】:

原因很简单:你的第一个线程被你创建的任务阻塞了:

            Task task = SwitchToProjectsPanelAsync();
            task.Wait(); // this is a blocking call

相反,您应该使用基于等待的语法:

private async void navigationTreeView_AfterSelect(object sender, TreeViewEventArgs e)
{
    await SwitchToProjectsPanelAsync();
}

另一个需要注意的地方是“等待代码中最长的部分是什么?”。我怀疑您也必须将“_controller.GetProjectsList()”转换为 async/await,因为它也会给您带来麻烦(经验法则:不要从其他线程触摸 UI!然后您就这样做了在您的 SwitchToProjectsPanelAsync 中)。

附:请注意此方法签名中出现的“async void”组合。当然,您应该尽可能避免它并使用“异步任务”或“异步任务”。否则,无法正确传递异常信息。看到这个不错的帖子https://haacked.com/archive/2014/11/11/async-void-methods

【讨论】:

  • 使用 await 本身并不能解决 OP 的问题。
  • @PeterDuniho,是的,我也公开了我的答案
  • 谢谢,>(经验法则:不要从其他线程触摸 UI!而且您在 SwitchToProjectsPanelAsync 中这样做)非常有帮助,现在我明白为什么 UI 被阻止了。看来我应该尝试控制器中的异步等待已安装。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 2019-11-03
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多