Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю Страница 301
- Категория: Компьютеры и Интернет / Базы данных
- Автор: Троелсен Эндрю
- Страниц: 642
- Добавлено: 2023-08-26 14:00:22
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних просмотр данного контента СТРОГО ЗАПРЕЩЕН! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту 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 - Троелсен Эндрю читать онлайн бесплатно
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 для возвращения целых чисел из последовательности. Чтобы вызывать этот метод, добавьте следующий код:
Жалоба
Напишите нам, и мы в срочном порядке примем меры.