2016-03-26 44 views
0

üzerinde bekletme Yöntemlerimden bazı garip davranışlar görüyorum. Yakın zamanda tüm zip arşivimi açmanın tüm Windows cihazlarında performans göstermediğini keşfettim. O kadar ki, ihtiyacım olan tek bir dosyayı ayıklamak için başvurdum, onu kullanarak arşivin geri kalanını ayıklamak için bekliyorum. Ancak, şu anda tek bir dosyayı çıkarmak için kod ve tüm arşivi ayıklamak için kod aynı yöntemden çağrılıyor. Bu yöntem, aslen ve en sonunda başlangıçta App.xaml.cs dosyasındaki kod tarafından kullanıcı arabiriminde çağrılır. Bu yöntemi çağırdığımda, uygulamanın yüklenmesi için ihtiyacım olan zip arşivinde bir dosya olduğu için tamamlanmasını beklemek için bekletme anahtar sözcüğünü kullanıyorum.Async çağrısı için beklemede olan async yöntemini

App.xaml şuna benzer:

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 
} 

sorun ExtractFullArchive tamamlanıncaya kadar DownloadArchive dönmek olmamasıdır ve ExtractFullArchive bir UZUN alıyor şudur:

SharedContext.ChangeUniverse("1234"); 

SharedContext şöyle zaman. DownloadArchive tamamlanırken asenkronize olarak yürütmek için ExtractFullArchive'a ihtiyacım var. Tamamlandığında umurumda değil.

+0

'ExtractToDirectory' aslında asenkron bir yöntem midir? –

cevap

0

Dont ExtractFullArchive bitirir, başka bir iş parçacığı üzerinde yöntemini yürütmek için yeni bir Task başlatabileceğinizi umurumda değil ne zaman yerine bekleyin bu

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 yalnızca olay işleyicileri gibi şeyler için kullanılmalıdır, bu yanlış görünüyor. https://msdn.microsoft.com/en-us/magazine/jj991977.aspx – Bartosz

0

gibi boşluğu dönmek istemiyorsanız Görevi iade . Bu yaklaşımla,henüz bitmemiş olsa da DownloadArchive yöntemi tamamlanır. Bu örneğin böyle olabilir.

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