Читать книгу 📗 "Язык программирования 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/catchCancellationTokenCancel()CancellationTokenSourceOperationCanceledExceptionНа заметку! Код
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()CancellationTokenTask.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()asyncIAsyncEnumerable<int>yield return