2016-03-26 217 views
0

我看到我的異步方法有一些奇怪的行爲。我最近發現解壓縮我的整個zip文件並不是在所有Windows設備上執行的。這樣我就可以提取我需要的單個文件,並在等待歸檔的其餘部分進行提取時使用它。但是,目前提取單個文件的代碼和提取整個壓縮文件的代碼是用相同的方法調用的。這種方法是異步的,並最終通過App.xaml.cs中的代碼最初在UI線程上調用。當我調用這個方法時,我使用await關鍵字來等待它完成,因爲我需要用於加載應用程序的zip壓縮文件中有一個文件。不要等待正在等待的異步方法內的異步調用

的App.xaml看起來是這樣的:

SharedContext.ChangeUniverse("1234"); 

SharedContext看起來是這樣的:

public static void ChangeUniverse(string universe) { 
    await DownloadArchive(universe); 
} 

public async Task DownloadArchive(string universe) { 
    ZipArchive archive = magic; // get it somehow 
    var someLocalFilePath = magic; // the exact location I need to extract data.json 
    var someLocalPath = magic; // the exact location I need to extract the zip 
    archive.GetEntry("data.json").ExtractToFile(someLocalFilePath); 
    // notice I do NOT await 
    ExtractFullArchive(archive, someLocalPath); 
} 

public async Task ExtractFullArchive(ZipArchive archive, string path) { 
    archive.ExtractToDirectory(path, true); // extracting using an override nice extension method I found on SO.com 
} 

的問題是,DownloadArchive不返回ExtractFullArchive完成,直到和ExtractFullArchive是什麼花費很長的時間。我需要ExtractFullArchive在DownloadArchive完成時異步執行。什麼時候結束我真的不在乎。

+0

'ExtractToDirectory'實際上是一個異步方法嗎? –

回答

0

不要返回的任務,如果你不想等待,而不是像這樣

public async void ExtractFullArchive(ZipArchive archive, string path) { 
    archive.ExtractToDirectory(path, true); // extracting using an override nice extension method I found on SO.com 
} 
+0

異步無效只應用於事件處理程序這樣的事情,這似乎是錯誤的。 https://msdn.microsoft.com/en-us/magazine/jj991977.aspx – Bartosz

0

返回void當你不小心的時候ExtractFullArchive完成後,你就可以開始一個新的Task到另一個線程中執行的方法。通過這種方法,DownloadArchive方法結束,但ExtractFullArchive尚未完成。例如,這可能看起來像這樣。

public async Task DownloadArchive(string universe) { 
    ZipArchive archive = magic; // get it somehow 
    var someLocalFilePath = magic; // the exact location I need to extract data.json 
    var someLocalPath = magic; // the exact location I need to extract the zip 
    archive.GetEntry("data.json").ExtractToFile(someLocalFilePath); 
    Task.Run(() => ExtractFullArchive(archive, someLocalPath)); 
}