我對 C# 很陌生,仍在嘗試了解異步方法的工作原理。我的 UWP 應用需要在將壓縮文件夾拖放到屏幕上時從壓縮文件夾中檢索縮略圖 JPG,在文件夾上傳時顯示帶有進度環的縮略圖,然后在上傳完成時移除進度環。首先,當用戶刪除文件時觸發此方法:private async void OnFileDrop(object sender, DragEventArgs e){ if (e.DataView.Contains(StandardDataFormats.StorageItems)) { var items = await e.DataView.GetStorageItemsAsync(); if (items.Count > 0) { foreach (var appFile in items.OfType<StorageFile>()) { StorageFolder downloadFolder = ApplicationData.Current.LocalFolder; StorageFolder unzipFolder = await downloadFolder.CreateFolderAsync(Path.GetFileNameWithoutExtension(appFile.Name), CreationCollisionOption.GenerateUniqueName); await UnZipFileAsync(appFile, unzipFolder); } } }下一個:public static IAsyncAction UnZipFileAsync(StorageFile zipFile, StorageFolder destinationFolder, Action<ZipArchiveEntry, StorageFolder> callback, Action<ZipArchiveEntry> completeCallback) { return UnZipFileHelper(zipFile, destinationFolder, thumbnailCallback, completeCallback).AsAsyncAction(); }然后這個任務解壓文件,在 ZipArchive 被創建后調用thumbnailCallback 方法: private static async Task UnZipFileHelper(StorageFile zipFile, StorageFolder destinationFolder, Action<ZipArchiveEntry, StorageFolder> thumbnailCallback, Action<ZipArchiveEntry> completeCallback) { if (zipFile == null || destinationFolder == null || !Path.GetExtension(zipFile.Name).Equals(".zip", StringComparison.OrdinalIgnoreCase) ) { throw new ArgumentException("Invalid argument..."); } Stream zipMemoryStream = await zipFile.OpenStreamForReadAsync();這是應該在上傳文件夾時顯示縮略圖的縮略圖回調方法:現在,只有在首先調用 MessageDialog.ShowAsync() 時才會顯示縮略圖,并且在單擊對話框上的“確定”按鈕之前不會顯示縮略圖。
1 回答

慕神8447489
TA貢獻1780條經驗 獲得超1個贊
thumbnailCallback
被稱為沒有await
。這就是不顯示縮略圖的原因(如果幸運的話,您可能會隨機獲得縮略圖:))。當您放置 MessageDialog 時,線程有足夠的時間在用戶交互后執行。
怎么修
像下面這樣調用它:
await thumbnailCallback(thumbnail, destinationFolder);
建議 :
將簽名更改為
public async Task thumbnailCallback(ZipArchiveEntry thumbnail, StorageFolder destinationFolder)
通常,您會想要返回一個Task
. 主要的例外應該是當您需要一個 void 返回類型(對于事件)。
async
返回 void 的方法在另一方面是特殊的:它們代表頂級async
操作,并且在您的任務返回exception
.
- 1 回答
- 0 關注
- 149 瀏覽
添加回答
舉報
0/150
提交
取消