2013-03-04 69 views
1

這是我在長時間運行任務期間遇到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; 
    } 
    } 
} 
+3

['async'不會在後臺線程上運行您的代碼。](http://blogs.msdn.com/b/pfxteam/archive/2012/04/12/async-await-faq.aspx) – 2013-03-04 03:32:18

回答

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調用 - 它只是處理一些數據,然後返回某種結果。

+0

很好的答案!這正是我所錯過的。它現在按我的預期工作。 – 2013-03-04 13:00:13