Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Троелсен Эндрю, "Язык программирования 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
OperationCanceledException
На заметку! Код
try/catch
Наконец, добавьте финальный метод
ProcessFile()
private async Task ProcessFile(string currentFile,
string outputDirectory, CancellationToken token)
{
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
Асинхронные потоки (нововведение в версии 8.0)
В версии C# 8.0 появилась возможность создания и потребления потоков данных (раскрываются в главе 20) асинхронным образом. Метод, который возвращает асинхронный поток данных:
• объявляется с модификатором
async
• возвращает реализацию
IAsyncEnumerable<T>
• содержит операторы
yield return
Взгляните на приведенный далее пример:
public static async IAsyncEnumerable<int> GenerateSequence()
{
for (int i = 0; i < 20; i++)
{
await Task.Delay(100);
yield return i;
}
}
Метод
GenerateSequence()
async
IAsyncEnumerable<int>
yield return