c# - 异步任务仍然阻塞 UI 线程

标签 c# multithreading asynchronous

我真的在尝试了解async/awaitTasks。我正在尝试找出一种方法,以便我可以在整个程序中使用它。基本上,我有自己的 BusyIndi​​cator 版本,我想在工作完成时显示它。这是一个基本示例;

private async void OnPageLoad(object sender, RoutedEventArgs e)
{
    var waitWindow = new PleaseWaitWindow();

    waitWindow.Show();

    await LoadCompanyContracts();

    waitWindow.Close();
}

private async Task LoadCompanyContracts()
{
    await Task.Run(() =>
    {
        Dispatcher.Invoke(() =>
        {
             //Work done here
        });
    });     
}

即使通过这两种方法并尝试实现Tasks,我的BusyIndi​​cator仍然不旋转,它显示但被卡住,所以实际上我相信UI线程仍然是被阻止。如何修改这段代码以确保所有 CPU 密集型工作不会阻塞 UI 线程?

最佳答案

作为一般规则,您根本不应该使用 Dispatcher。这是极其常见的做法,但通常是不好的做法。

private async Task LoadCompanyContracts()
{
  await Task.Run(() =>
  {
    //Work done here
  });
  // Update UI if necessary.
}

关于c# - 异步任务仍然阻塞 UI 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38476723/

相关文章:

c# - MVC ActionResult - 可为 Null 或可选参数

c# - catch 关键字如何确定抛出的异常类型?

c++ - 函数体中静态定义的互斥量是否能够正确锁定?

java - Android 上的 runOnUiThread() 和无限循环

java - 用于异步客户端到客户端消息传递的库

c# - 内部列表上的 Entity Framework 过滤器

c# - 在 linq 连接的结果中为 null 设置默认值

ios - 线程(异步队列)在 Swift 中是如何工作的?

ios - NSURLConnection didReceiveData 未加载数据

javascript - 在 node.js/express.js 中从多个异步源构建对象