【问题标题】:Loading collection view with task async method使用任务异步方法加载集合视图
【发布时间】:2020-03-16 01:08:51
【问题描述】:

我正在尝试使用依赖服务的异步任务方法加载缩略图:

在我的 pcl 页面中,我有这个:

protected override void OnAppearing()
        {

            Device.BeginInvokeOnMainThread(() => UserDialogs.Instance.ShowLoading("Loading...", MaskType.Black));

            Task.Run(async () =>
            {
                directoryPath = await getThumbnails.GetBitmaps(fileInfo.FullName);
                List<ThumbnailsModel> thumbnailsModels = new List<ThumbnailsModel>();

                int i = 1;
                Directory.GetFiles(directoryPath).ToList<string>().ForEach(delegate (string thumbnailsEmplacement)
                {
                    thumbnailsModels.Add(new ThumbnailsModel(i, thumbnailsEmplacement));
                    i++;
                });
                CollectionViewThumbnails.ItemsSource = thumbnailsModels;


            }).ContinueWith(result => Device.BeginInvokeOnMainThread(() =>
            {


                UserDialogs.Instance.HideLoading();
            }
        )
        );
        }

我获取缩略图的方法:

public async Task<string> GetBitmaps(string filePath)
    {

        //TODO-- WORK ON THIS

        var appDirectory = System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments);
        string fileName = System.IO.Path.GetFileNameWithoutExtension(filePath);
        string directoryPath = System.IO.Path.Combine(appDirectory, "thumbnailsTemp", System.IO.Path.GetFileNameWithoutExtension(fileName));

        var stream = new MemoryStream();

        using (Stream resourceStream = new FileStream(filePath, FileMode.Open))
        {
            resourceStream.CopyTo(stream);
        }

        Document document = new Document(stream);
        int count = document.Pages.Count;

        for(int i = 0; i<= count; i++) {
            TallComponents.PDF.Rasterizer.Page page = document.Pages[0];

            using (var outputStream = new FileStream(System.IO.Path.Combine(directoryPath, fileName + "Thumbnails" + i + ".png"), FileMode.Create, FileAccess.Write))
            {

                await Task.Run(() =>
                {

                    page.SaveAsBitmap(outputStream, CompressFormat.Png, 5);
                });
            }
        }

        return directoryPath;
    }

问题是我的应用程序进入我的依赖服务方法,然后在缩略图完成之前返回我的 pcl OnAppearing 方法并进入这一行

UserDialogs.Instance.HideLoading();

【问题讨论】:

  • 不确定你的问题是什么,因为我没有在 xamarin 中编程,但我知道的是,如果你想异步编程,你还需要添加 ConfigureAwait() 并且你有内存泄漏,因为你的内存流也有一个 dispose 模式,所以你也需要使用 using。
  • 简答:不要使用ContinueWith;请改用await

标签: c# xamarin xamarin.forms xamarin.android


【解决方案1】:

好像你有一个未处理的异常。即使在您正在继续的Task 上引发异常,该继续将运行

这可以在ContinueWith 的重载中使用类似TaskContinuationOptions.OnlyOnRanToCompleted(和others)的内容进行更改。如果未指定,默认为TaskContinuationOptions.None

或者,如果您希望它在失败时运行并处理它,您可以在您的延续中访问result.Exception

【讨论】:

  • 好了,现在这个过程运行良好。我的列表中有我的所有项目,但是当我隐藏加载页面时,我的屏幕上没有一个项目。
  • 说得对,解释得很好
  • Ok 修复了问题,我在隐藏加载页面之前设置了我的收藏视图的项目来源。它工作,ty。
猜你喜欢
  • 1970-01-01
  • 2020-07-31
  • 1970-01-01
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
相关资源
最近更新 更多