为了账号安全,请及时绑定邮箱和手机立即绑定

异步方法仅在调用 MessageDialog 时有效

异步方法仅在调用 MessageDialog 时有效

C#
海绵宝宝撒 2021-06-23 17:18:26
我对 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.


查看完整回答
反对 回复 2021-06-26
  • 1 回答
  • 0 关注
  • 135 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信