我对 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 关注
- 135 浏览
添加回答
举报
0/150
提交
取消