Чтение онлайн

ЖАНРЫ

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

Чтобы взглянуть на параллелизм задач в действии, создайте новый проект консольного приложения по имени

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:

<
Поделиться с друзьями: