不要等待

时间:2016-03-26 14:51:10

标签: c# multithreading xaml asynchronous win-universal-app

我从异步方法中看到一些奇怪的行为。我最近发现解压缩我的整个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需要很长时间后才会返回。在DownloadArchive完成时,我需要ExtractFullArchive异步执行。完成后我真的不在乎。

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:0)

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));
}