在WPF C#5.0和.NET 4.5中阻止异步调用
问题描述:
这是我在长时间运行任务期间遇到UI阻塞问题的一段代码。我看过其他一些似乎做同样事情的例子,但这不起作用。我认为这很简单。在WPF C#5.0和.NET 4.5中阻止异步调用
我错过了什么?
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;
}
}
}
答
您当前的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调用 - 它只是处理一些数据,然后返回某种结果。
+0
很好的答案!这正是我所错过的。它现在按我的预期工作。 – 2013-03-04 13:00:13
['async'不会在后台线程上运行您的代码。](http://blogs.msdn.com/b/pfxteam/archive/2012/04/12/async-await-faq.aspx) – 2013-03-04 03:32:18