Язык программирования 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:
<
Поделиться с друзьями: