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

我对 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() 时才会显示缩略图,并且在单击对话框上的“确定”按钮之前不会显示缩略图。


海绵宝宝撒
浏览 136回答 1
1回答

慕神8447489

thumbnailCallback被称为没有await。这就是不显示缩略图的原因(如果幸运的话,您可能会随机获得缩略图:))。当您放置 MessageDialog 时,线程有足够的时间在用户交互后执行。怎么修像下面这样调用它:await&nbsp;thumbnailCallback(thumbnail,&nbsp;destinationFolder);建议 :将签名更改为public&nbsp;async&nbsp;Task&nbsp;thumbnailCallback(ZipArchiveEntry&nbsp;thumbnail,&nbsp;StorageFolder&nbsp;destinationFolder)通常,您会想要返回一个Task.&nbsp;主要的例外应该是当您需要一个 void 返回类型(对于事件)。async返回 void 的方法在另一方面是特殊的:它们代表顶级async操作,并且在您的任务返回exception.
打开App,查看更多内容
随时随地看视频慕课网APP