2016-03-26 15 views
0

私の非同期メソッドから何らかの奇妙な動作が見られます。私は最近、私のzipアーカイブ全体を解凍しても、すべてのWindowsデバイスでパフォーマンスが向上していないことを発見しました。私が必要とする1つのファイルを抽出し、それを使って残りのアーカイブを抽出するのを待っているので、しかし、現在、単一のファイルを抽出するコードとアーカイブ全体を抽出するコードは、同じメソッドから呼び出されています。このメソッドは非同期で、最終的にはApp.xaml.cs.xのコードでUIスレッドで呼び出されます。このメソッドを呼び出すと、awaitキーワードを使用して、アプリケーションの読み込みに必要なzipアーカイブに1つのファイルがあるので、完了するのを待ちます。待機中の非同期呼び出しを待機しないでください。

App.xamlは、次のようになります。

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 
} 

問題はExtractFullArchiveが完了するまでDownloadArchiveは戻らないということで、ExtractFullArchiveはLONG​​を取っているものです。

SharedContext.ChangeUniverse("1234"); 

SharedContextはこのようになります時間。 DownloadArchiveが完了している間、非同期で実行するにはExtractFullArchiveが必要です。私は本当にそれが終わるとき気にしません。

+0

実際には「ExtractToDirectory」は非同期メソッドですか? –

答えて

0

いけないあなたはときExtractFullArchive終了あなたが気にしない場合は、あなたが別のスレッドでメソッドを実行するための新しいTaskを開始することができ、この

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

Async voidは、イベントハンドラなどの場合にのみ使用する必要がありますが、これは間違っています。 https://msdn.microsoft.com/en-us/magazine/jj991977.aspx – Bartosz

0

のように空を返す代わりに待ちたくない場合は、タスクを返します。このアプローチでは、ExtractFullArchiveはまだ完了していませんが、DownloadArchiveメソッドは終了します。これは、例えばこれのように見えるかもしれません。

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)); 
} 
関連する問題