Kniga-Online.club
» » » » Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Читать бесплатно Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю. Жанр: Базы данных год 2004. Так же читаем полные версии (весь текст) онлайн без регистрации и SMS на сайте kniga-online.club или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Перейти на страницу:

  var outputDirectory =

    Path.Combine(basePath, "ModifiedPictures");

  // Удалить любые существующие файлы

  if (Directory.Exists(outputDirectory))

  {

    Directory.Delete(outputDirectory, true);

  }

  Directory.CreateDirectory(outputDirectory);

  string[] files = Directory.GetFiles(

    pictureDirectory, "*.jpg", SearchOption.AllDirectories);

  try

  {

    foreach(string file in files)

    {

      try

      {

        await ProcessFile(

         file, outputDirectory,_cancelToken.Token);

      }

      catch (OperationCanceledException ex)

      {

        Console.WriteLine(ex);

        throw;

      }

    }

  }

  catch (OperationCanceledException ex)

  {

    Console.WriteLine(ex);

    throw;

  }

  catch (Exception ex)

  {

    Console.WriteLine(ex);

    throw;

  }

  _cancelToken = null;

  this.Title = "Processing complete";

}

После начальных настроек в коде организуется цикл по файлам с асинхронным вызовом метода ProcessFile() для каждого файла. Вызов метода ProcessFile() помещен внутрь блока try/catch и ему передается объект CancellationToken. Если вызов Cancel() выполняется на CancellationTokenSource (т.е. когда пользователь щелкает на кнопке Cancel), тогда генерируется исключение OperationCanceledException.

На заметку! Код try/catch может находиться где угодно в цепочке вызовов (как вскоре вы увидите). Размещать его при первом вызове или внутри самого асинхронного метода — вопрос личных предпочтений и нужд приложения.

Наконец, добавьте финальный метод ProcessFile():

private async Task ProcessFile(string currentFile,

  string outputDirectory, CancellationToken token)

{

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

  string filename = Path.GetFileName(currentFile);

  using (Bitmap bitmap = new Bitmap(currentFile))

  {

    try

    {

      await Task.Run(() =>

      {

        Dispatcher?.Invoke(() =>

        {

          this.Title = $"Processing {filename}";

        });

        bitmap.RotateFlip(RotateFlipType.Rotate180FlipNone);

        bitmap.Save(Path.Combine(outputDirectory, filename));

      }

     ,token);

    }

    catch (OperationCanceledException ex)

    {

      Console.WriteLine(ex);

      throw;

    }

  }

}

Метод ProcessFile() использует еще одну перегруженную версию Task.Run(), которая принимает в качестве параметра объект CancellationToken. Вызов Task.Run() помещен внутрь блока try/catch (как и вызывающий код) на случай щелчка пользователем на кнопке Cancel.

Асинхронные потоки (нововведение в версии 8.0)

В версии C# 8.0 появилась возможность создания и потребления потоков данных (раскрываются в главе 20) асинхронным образом. Метод, который возвращает асинхронный поток данных:

• объявляется с модификатором async;

• возвращает реализацию IAsyncEnumerable<T>;

• содержит операторы yield return (рассматривались в главе 8) для возвращения последовательных элементов в асинхронном потоке данных.

Взгляните на приведенный далее пример:

public static async IAsyncEnumerable<int> GenerateSequence()

{

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

  for (int i = 0; i < 20; i++)

  {

   await Task.Delay(100);

    yield return i;

  }

}

Метод GenerateSequence() объявлен как async, возвращает реализацию IAsyncEnumerable<int> и применяет yield return для возвращения целых чисел из последовательности. Чтобы вызывать этот метод, добавьте следующий код:

Перейти на страницу:

Троелсен Эндрю читать все книги автора по порядку

Троелсен Эндрю - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки kniga-online.club.


Язык программирования C#9 и платформа .NET5 отзывы

Отзывы читателей о книге Язык программирования C#9 и платформа .NET5, автор: Троелсен Эндрю. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор kniga-online.


Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*