在WPF C#5.0和.NET 4.5中阻止异步调用

时间:2013-03-04 01:32:01

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

这是一段代码,我在长时间运行的任务中遇到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;
    }
  }
}

1 个答案:

答案 0 :(得分:4)

您当前的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调用 - 它只是处理一些数据,然后返回某种结果。