Язык программирования C#9 и платформа .NET5
Шрифт:
Дважды щелкните на имени файла
MainWindow.xaml
в окне Solution Explorer и поместите в него показанное далее содержимое XAML:
<Window x:Class="DataParallelismWithForEach.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:DataParallelismWithForEach"
mc:Ignorable="d"
Title="Fun with TPL" Height="400" Width="800">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Label Grid.Row="0" Grid.Column="0">
Feel free to type here while the images are processed...
</Label>
<TextBox Grid.Row="1" Grid.Column="0" Margin="10,10,10,10"/>
<Grid Grid.Row="2" Grid.Column="0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Button Name="cmdCancel" Grid.Row="0" Grid.Column="0"
Margin="10,10,0,10"
Click="cmdCancel_Click">
Cancel
</Button>
<Button Name="cmdProcess" Grid.Row="0" Grid.Column="2"
Margin="0,10,10,10"
Click="cmdProcess_Click">
Click to Flip Your Images!
</Button>
</Grid>
</Grid>
</Window>
И
TextBox
и одной кнопки Button
(по имени cmdProcess
). Текстовая область предназначена для ввода данных во время выполнения работы в фоновом режиме, иллюстрируя тем самым неблокирующую природу параллельной задачи. В этом примере требуется дополнительный пакет NuGet (
System.Drawing.Common
). Чтобы добавить его в проект, введите следующую команду (целиком в одной строке) в окне командной строки (в каталоге, где находится файл решения) или в консоли диспетчера пакетов в Visual Studio:
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
включено несколько примеров изображений (поставляемых в составе операционной системы Windows).
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>\bin\debug\net5.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);
// Обработать данные изображений в блокирующей манере.
Поделиться с друзьями: