【问题标题】:Blocked async call in WPF C# 5.0 and .NET 4.5在 WPF C# 5.0 和 .NET 4.5 中阻止异步调用
【发布时间】:2013-02-18 01:06:20
【问题描述】:

这是一段代码,我在长时间运行的任务中遇到了 UI 阻塞问题。我见过其他似乎做同样事情的例子,但这不起作用。我认为这很简单。

我错过了什么?

public class ClipManager
{
    async public Task<int> AddNewClipsAsync()
    {
        int rc = AddNewClips();  // does the work
        return rc;
    }
}

public partial class MainWindow : Window
{
private async void UpdateClick(object sender, RoutedEventArgs e)
{
    // Check event to update library from WindowsMain.xml.cs
    private async void UpdateClick(object sender, RoutedEventArgs e)
    {

        UpdateBtn.IsEnabled = false;
        Console.WriteLine("Start of Update");
        var cm = ClipManagement.Create();

        int rc = await cm.AddNewClipsAsync();  // long running method

        // UI unfreezes at this point
        Console.WriteLine("After Update of Update");
        await Task.Delay(30000);  // just debugging code
        Console.WriteLine("After delay");
        LibraryDG.Items.Refresh();
        UpdateBtn.IsEnabled = true;
    }
  }
}

【问题讨论】:

标签: .net async-await c#-5.0


【解决方案1】:

您当前的AddNewClips 将阻止用户界面。您需要将其包装在Task.Run 中,以便它在后台运行:

public class ClipManager
{
    async public Task<int> AddNewClipsAsync()
    {
        int rc = await Task.Run<int>(() => AddNewClips());  // does the work
        return rc;
    }
}

上面的代码假定AddNewClips 不进行任何 UI 调用 - 它只是处理一些数据,然后返回某种结果。

【讨论】:

  • 很好的答案!这正是我所缺少的。它现在按我的预期工作。
猜你喜欢
  • 2012-05-29
  • 2014-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
  • 1970-01-01
  • 2014-08-03
  • 1970-01-01
相关资源
最近更新 更多