Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Троелсен Эндрю, "Язык программирования C#9 и платформа .NET5" бесплатно, без регистрации.
В этом примере требуется дополнительный пакет NuGet (
System.Drawing.Common
dotnet add DataParallelismWithForEach package System.Drawing.Common
Дважды щелкнув на имени файла
MainWindow.xaml.cs
MainWindow.xaml
using
// Обеспечить доступ к перечисленным ниже пространствам имен!
// (System.Threading.Tasks уже должно присутствовать благодаря
// выбранному шаблону.)
using System;
using System.Drawing;
using System.Threading.Tasks;
using System.Threading;
using System.Windows;
using System.IO;
На заметку! Вы должны обновить строку, передаваемую методу
Directory.GetFiles()
TestPictures
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void cmdCancel_Click(object sender, EventArgs e)
{
// Код метода будет вскоре обновлен.
}
private void cmdProcess_Click(object sender, EventArgs e)
{
ProcessFiles();
this.Title = "Processing Complete";
}
private void ProcessFiles()
{
// Загрузить все файлы *.jpg и создать новый каталог
// для модифицированных данных.
// Получить путь к каталогу с исполняемым файлом.
// В режиме отладки VS 2019 текущим каталогом будет
// <каталог npoeктa>bindebugnet5.0 - windows.
// В случае VS Code или команды dotnet run текущим
// каталогом будет <каталог проекта>.
var basePath = Directory.GetCurrentDirectory();
var pictureDirectory =
Path.Combine(basePath, "TestPictures");
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);
// Обработать данные изображений в блокирующей манере.
foreach (string currentFile in files)
{
string filename =
System.IO.Path.GetFileName(currentFile);
// Вывести идентификатор потока, обрабатывающего текущее изображение.
this.Title = $"Processing {filename}
on thread {Thread.CurrentThread.
ManagedThreadId}";
using (Bitmap bitmap = new Bitmap(currentFile))
{
bitmap.RotateFlip(RotateFlipType.Rotate180FlipNone);
bitmap.Save(System.IO.Path.Combine(
outputDirectory, filename));
}
}
}
}
На заметку! В случае получения сообщения об ошибке, связанной с неоднозначностью имени
Path
System.IO.Path
System.Windows.Shapes.Path
using
System.Windows.Shapes
System.IO
Path
System.IO.Path.Combine(...).
Обратите внимание, что метод
ProcessFiles()
*.jpg
Чтобы обрабатывать файлы на как можно большем количестве процессоров, текущий цикл
foreach
Parallel.ForEach()
IEnumerable<T>
files
Action<T>