Загрузка представления коллекции с помощью метода asyn c - PullRequest
1 голос
/ 15 марта 2020

Я пытаюсь загрузить миниатюры с помощью asyn c Метод задачи с помощью службы зависимостей:

На моей странице 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;
    }

Проблема в том, что мое приложение собирается в моем методе службы Dependency, а затем возвращается в мой метод pcl OnAppearing до того, как миниатюры будут сделаны, и переходит в эту строку

UserDialogs .Instance.HideLoading ();

1 Ответ

3 голосов
/ 15 марта 2020

Похоже, у вас есть необработанное исключение. Это продолжение будет выполняться , даже если на Task вы продолжаете возникать исключение.

Это можно изменить, используя что-то вроде TaskContinuationOptions.OnlyOnRanToCompleted другие ) при перегрузке на ContinueWith. По умолчанию используется значение TaskContinuationOptions.None, если оно не указано.

Кроме того, вы можете получить доступ к result.Exception в своем продолжении, если хотите, чтобы оно запускалось при сбое и обрабатывало его.

...