2014-03-01 46 views
1

我的一部分流程有時會拉鍊文件,而我試圖使該流程異步。我對此很新穎。使用Task.Run()異步壓縮會阻止UI。我錯過了什麼?

我以前用過「await Task.Run((=)DoSomething())」,並沒有遇到任何問題。出於某種原因,當我的程序達到等待Task.Run()時,它會無限期地掛起。

有人會讓我知道我錯過了什麼嗎?提前致謝。

public static async Task<BackupResultHelper> BackupAndZip(List<MyBackupItem> itemList, FileInfo targetFi) { 
     DirectoryInfo zipSourceDi = new DirectoryInfo(targetFi.Directory + "\\Temp"); 

     if (targetFi.Exists) 
      targetFi.Delete(); 

     if (!Directory.Exists(zipSourceDi.FullName)) 
      Directory.CreateDirectory(zipSourceDi.FullName); 

     foreach (MyBackupItem item in itemList) { 
      DirectoryInfo dir = new DirectoryInfo(zipSourceDi.FullName + "\\" + item.Name); 
      if (!BackupItem(item, dir.FullName)) return ErrorResultHelper; 
     } 

     await Task.Run(() => ZipFile.CreateFromDirectory(zipSourceDi.FullName, targetFi.FullName, CompressionLevel.Optimal, false)); 

     Directory.Delete(zipSourceDi.FullName, true); 
     string time = DateTime.Now.ToLongTimeString(); 
     return new BackupResultHelper(){Success = true, Message = "Backup complete!", BackupDateTime = time}; 
    } 
+0

你有沒有用異步事件處理函數調用這個函數? –

+0

@Thomas不,我沒有。在我對斯蒂芬的迴應中,我將主旨與調用方法聯繫起來。 – CubemonkeyNYC

回答

1

我懷疑你有代碼進一步上漲正在調用Task.WaitTask<T>.Result調用棧,這就是問題的所在。

如果您使用UI或ASP.NET請求線程執行處理,然後阻止異步任務,您在我的博客上描述了您的run the risk of a deadlock。默認情況下,await將捕獲當前「上下文」(例如,UI上下文),並在該上下文中恢復方法(例如,在UI線程上)。如果您阻止了該上下文(例如,通過在UI線程上調用Task.WaitTask<T>.Result),那麼async方法將無法恢復執行,並且無法完成該任務。

+0

在這種情況下,這不是罪魁禍首,儘管我敢肯定它對你來說同樣顯而易見。這是調用我發佈的代碼的方法。 https://gist.github.com/rcornell/9291035該調用在Switch語句中是第二種情況。這始終由UI線程啓動。您的博客是一個偉大的閱讀,謝謝。 – CubemonkeyNYC

+1

什麼叫'StartBackup'? –

+0

啊!我找到了。堆棧中有一個「.result」。學過的知識。非常感謝。 – CubemonkeyNYC