我从异步方法中看到一些奇怪的行为。我最近发现解压缩我的整个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异步执行。完成后我真的不在乎。
答案 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));
}