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

Тут можно читать бесплатно Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен. Жанр: Компьютеры и Интернет / Программирование. Так же Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте FullBooks.club (Фулбукс) или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних просмотр данного контента СТРОГО ЗАПРЕЩЕН! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту pbn.book@yandex.ru для удаления материала


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

Прочтите описание перед тем, как прочитать онлайн книгу «Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен» бесплатно полную версию:

В 10-м издании книги описаны новейшие возможности языка C# 9 и .NET 5 вместе с подробным "закулисным" обсуждением, призванным расширить навыки критического мышления разработчиков, когда речь идет об их ремесле.
Книга охватывает ASP.NET Core, Entity Framework Core и многое другое наряду с последними обновлениями унифицированной платформы .NET, начиная с улучшений показателей производительности настольных приложений Windows в .NET 5 и обновления инструментария XAML и заканчивая расширенным рассмотрением файлов данных и способов обработки данных.
Все примеры кода были переписаны с учетом возможностей последнего выпуска C# 9.

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

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

            SearchOption.AllDirectories);

  string outputDirectory = @".\ModifiedPictures";

  Directory.CreateDirectory(outputDirectory);

  try

  {

    // Обработать данные изображения в параллельном режиме!

    Parallel.ForEach(files, parOpts, currentFile =>

    {

      parOpts

         .CancellationToken.ThrowIfCancellationRequested();

      string filename = Path.GetFileName(currentFile);

      Dispatcher?.Invoke(() =>

      {

        this.Title =

          $"Processing {filename}

             on thread {Thread.CurrentThread.ManagedThreadId}";

      });

      using (Bitmap bitmap = new Bitmap(currentFile))

      {

        bitmap.RotateFlip(RotateFlipType.Rotate180FlipNone);

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

      }

    });

    Dispatcher?.Invoke(()=>this.Title = "Done!");

  }

  catch (OperationCanceledException ex)

  {

    Dispatcher?.Invoke(()=>this.Title = ex.Message);

  }

}

Обратите внимание, что в начале метода конфигурируется объект ParallelOptions с установкой его свойства CancellationToken для применения маркера CancellationTokenSource. Кроме того, этот объект ParallelOptions передается во втором параметре методу Parallel.ForEach().

Внутри логики цикла осуществляется вызов ThrowIfCancellationRequested() на маркере отмены, гарантируя тем самым, что если пользователь щелкнет на кнопке Cancel, то все потоки будут остановлены ив качестве уведомления сгенерируется исключение времени выполнения. Перехватив исключение OperationCanceledException, можно добавить в текст главного окна сообщение об ошибке.

Обеспечение параллелизма задач с помощью класса Parallel

В дополнение к обеспечению параллелизма данных библиотека TPL также может использоваться для запуска любого количества асинхронных задач с помощью метода Parallel.Invoke(). Такой подход немного проще, чем применение делегатов или типов из пространства имен System.Threading, но если нужна более высокая степень контроля над выполняемыми задачами, тогда следует отказаться от использования Parallel.Invoke() и напрямую работать с классом Task, как делалось в предыдущем примере.

Чтобы взглянуть на параллелизм задач в действии, создайте новый проект консольного приложения по имени MyEBookReader и импортируйте в начале файла Program.cs пространства имен System.Threading, System.Text, System.Threading.Tasks, System.Linq и System.Net (пример является модификацией полезного примера из документации по .NET Core). Здесь мы будем извлекать публично доступную электронную книгу из сайта проекта Гутенберга (www.gutenberg.org) и затем параллельно выполнять набор длительных задач. Книга загружается в методе GetBook(), показанном ниже:

using System;

using System.Linq;

using System.Threading;

using System.Threading.Tasks;

using System.Net;

using System.Text;

string _theEBook = "";

GetBook();

Console.WriteLine("Downloading book...");

Console.ReadLine();

void GetBook()

{

  WebClient wc = new WebClient();

  wc.DownloadStringCompleted += (s, eArgs) =>

  {

    _theEBook = eArgs.Result;

    Console.WriteLine("Download complete.");

    GetStats();

  };

  // Загрузить электронную книгу Чарльза Диккенса "A Tale of Two Cities".

  // Может понадобиться двукратное выполнение этого кода, если ранее вы

  // не посещали данный сайт, поскольку при первом его посещении появляется

  // окно с сообщением, предотвращающее нормальное выполнение кода.

  wc.DownloadStringAsync(new Uri("http://www.gutenberg.org/

  files/98/98-8.txt"));

}

Класс WebClient определен в пространстве имен System.Net. Он предоставляет несколько методов для отправки и получения данных от ресурса, идентифицируемого посредством URL. В свою очередь многие из них имеют асинхронные версии, такие как метод DownloadStringAsync(), который автоматически порождает новый поток из пула потоков .NET Core Runtime. Когда объект WebClient завершает получение данных, он инициирует событие DownloadStringCompleted, которое обрабатывается с применением лямбда-выражения С#. Если вызвать синхронную версию этого метода (DownloadString()), то сообщение Downloading book... не появится до тех пор, пока загрузка не завершится.

Далее реализуйте метод GetStats() для извлечения индивидуальных слов, содержащихся в переменной theEBook, и передачи строкового массива на обработку нескольким вспомогательным методам:

void GetStats()

{

  // Получить слова из электронной книги.

  string[] words = _theEBook.Split(new char[]

    { ' ', '\u000A', ',', '.', ';', ':', '-', '?', '/' },

    StringSplitOptions.RemoveEmptyEntries);

  // Найти 10 наиболее часто встречающихся слов.

  string[] tenMostCommon = FindTenMostCommon(words);

  // Получить самое длинное слово.

  string longestWord = FindLongestWord(words);

  // Когда все задачи завершены, построить строку, показывающую

  // все статистические данные в окне сообщений.

  StringBuilder bookStats =

      new StringBuilder("Ten Most Common Words are:\n");

  foreach (string s in tenMostCommon)

  {

    bookStats.AppendLine(s);

  }

  bookStats.AppendFormat("Longest word is: {0}", longestWord);

                       // Самое длинное слово

  bookStats.AppendLine();

  Console.WriteLine(bookStats.ToString(), "Book info");

                                        // Информация о книге

}

Метод FindTenMostCommon() использует запрос LINQ для получения списка объектов string, которые наиболее часто встречаются в массиве string, а метод FindLongestWord() находит самое длинное слово:

string[] FindTenMostCommon(string[] words)

{

    var frequencyOrder = from word in words

                         where word.Length > 6

                         group word by word into g

                         orderby g.Count() descending

                         select g.Key;

    string[] commonWords = (frequencyOrder.Take(10)).ToArray();

    return commonWords;

}

string FindLongestWord(string[] words)

{

    return (from w in words orderby w.Length descending select w)

        .FirstOrDefault();

}

После запуска проекта выполнение всех задач может занять внушительный промежуток времени, что зависит от количества процессоров в машине и их тактовой частоты. В конце концов, должен появиться следующий вывод:

Downloading book...

Download complete.

Ten Most Common Words are:

Defarge

himself

Manette

through

nothing

business

another

looking

prisoner

Cruncher

Longest word is: undistinguishable

Помочь удостовериться в том, что приложение задействует все доступные процессоры машины, может параллельный вызов методов FindTenMostCommon() и FindLongestWord(). Для этого модифицируйте метод GetStats():

void GetStats()

{

  // Получить слова из электронной книги.

  string[] words = _theEBook.Split(

    new char[] { ' ', '\u000A', ',', '.', ';', ':', '-', '?', '/' },

    StringSplitOptions.RemoveEmptyEntries);

  string[] tenMostCommon = null;

  string longestWord = string.Empty;

  Parallel.Invoke(

    () =>

    {

      // Найти 10 наиболее

Перейти на страницу:
Вы автор?
Жалоба
Все книги на сайте размещаются его пользователями. Приносим свои глубочайшие извинения, если Ваша книга была опубликована без Вашего на то согласия.
Напишите нам, и мы в срочном порядке примем меры.
Комментарии / Отзывы
    Ничего не найдено.