44
метод, который будет выполняться в отдельном потоке. Затем вы
сообщите о продвижении потока и реализуете функциональность отмены
фонового процесса.
1. Создайте
новый
проект
Windows
Forms.
Назовите
его
WinBackgroundWorker.
2. Добавьте на форму элементы управления: два элемента
Label,
TextBox,
ProgressBar и
две кнопки Button.
3. Для элементов укажите свойства в соответствии с таблицей:
Элемент
Свойство Значение
Location
10;15
label1
Text
Second to sleep
Location
10; 40
label2
Text
Progress
Location
105; 13
textBox1
Size
80; 20
Location
110; 40
progressBar
Size
240; 20
Location
195; 12
Text
Start
button1
Size
75; 25
Location
270; 12
Text
Cancel
button2
Size
75; 25
Form1
Size
370;110
4. Для элемента
textBox1 допустимыми значениями будут только
цифры, поэтому в обработчике события
KeyPress для текстового поля
textBox1 укажите код:
if (!char.IsDigit(e.KeyChar))
{
e.Handled = true;
MessageBox.Show("Поле должно содержать цифры");
}
5. Из Toolbox перетащите элемент
BackgroundWorker в форму.
6. В окне Properties установите свойства
WorkerSupportsCancellation
и
WorkerReportsProgress в
True (для поддержки асинхронной отмены и
возможности сообщения основному потоку информации о продвижении
фонового процесса соответственно)
.
7. Дважды щелкните
BackgroundWorker, чтобы открыть обработчик
события backgroundWorker1_DoWork
по умолчанию.
Добавьте к этому
обработчику события следующий код:
int i;
i = int.Parse(e.Argument.ToString());
for (int j=1; j <= i; j++)
{
if (backgroundWorker1.CancellationPending)
45
{
e.Cancel = true;
return;
}
System.Threading.Thread.Sleep(1000);
backgroundWorker1.ReportProgress((int)(j *100/ i));
}
8. Для элемента
backgroundWorkerl в окне Properties щелкните
кнопку Events, затем дважды щелкните
ProgressChanged, чтобы открыть
окно кода обработчика события backgroundWorker1_ProgressChanged.
Добавьте следующий код:
progressBar1.Value = e.ProgressPercentage;
9. Аналогичным
способом
добавьте
обработчик
события
RunWorkerCompleted,
в теле обработчика добавьте следующий код:
if (!(e.Cancelled))
System.Windows.Forms.MessageBox.Show("Run Completed!");
else
System.Windows.Forms.MessageBox.Show("Run Cancelled");
10. Для кнопки
Start откройте обработчик события Click. Добавьте
следующий код:
if (!(textBox1.Text == ""))
{
int i = int.Parse(textBox1.Text);
backgroundWorker1.RunWorkerAsync(i);
}
11. Для кнопки
Cancel откройте обработчик события
Click. Добавьте
следующий код
backgroundWorker1.CancelAsync();
12. Построите
и
выполните
приложение,
и
проверьте
его
функциональность.
Упражнение
2. Использование
делегатов
Выполнив это упражнение, вы создадите приложение, подобное тому,
что было создано в упражнении 1. Оно будет выполнять продолжительную
операцию в отдельном потоке с возможностью отмены, показывать
продвижение операции и уведомлять пользователя о ее завершении. Для
реализации этой функциональности вы
используете делегаты и
асинхронный вызов.
1. Создайте
новое
Windows-приложение
и
назовите
его
WinAsynchDelegate.
2. Повторите шаги 2 – 4 предыдущего упражнения для создания
требуемой формы.
3. Добавьте в приложение следующий метод:
private void TimeConsumingMethod(int seconds)
{
for (int j = 1; j <= seconds; j++)
System.Threading.Thread.Sleep(1000);
}
4. Используйте в приложении делегат, соответствующий методу
TimeConsumingMethod:
46
private delegate void TimeConsumingMethodDelegate(int
seconds);
5. Добавьте сообщающий о
продвижении операции метод, который
устанавливает
значение
элемента
управления
ProgressBar
потокобезопасным способом, и делегата этого метода:
public delegate void SetProgressDelegate(int val);
public void SetProgress(int val)
{
if (progressBar1.InvokeRequired)
{
SetProgressDelegate del = new
SetProgressDelegate(SetProgress);
this.Invoke(del, new object[] { val });
}
else
{
progressBar1.Value = val;
}
}
6. Для сообщения о продвижении операции добавьте следующую
строку кода в цикл
For метода
TimeConsumingMethod:
SetProgress((int)(j * 100) / seconds);
7. Добавьте в приложение логическую переменную с именем
Cancel:
bool Cancel;
8. Добавьте
следующие
строки
кода
в
цикл
For
метода
TimeConsumingMethod:
if (Cancel)
break;
9. Добавьте
следующий
код
после
цикла
For
метода
TimeConsumingMethod:
if (Cancel)
{
System.Windows.Forms.MessageBox.Show("Cancelled");
Cancel = false;
}
else
{
System.Windows.Forms.MessageBox.Show("Complete");
}
10. В конструкторе дважды щелкните кнопку GO!, чтобы открыть для
нее обработчик события
Click по умолчанию, и добавьте следующий код:
TimeConsumingMethodDelegate del = new
TimeConsumingMethodDelegate(TimeConsumingMethod);
del.BeginInvoke(int.Parse(textBox1.Text), null, null);
11. В конструкторе дважды щелкните кнопку Cancel, чтобы открыть
для
нее обработчик события Click по умолчанию, и добавьте следующий
код:
Cancel = true;
12. Скомпилируйте и проверьте ваше приложение.
47
Упражнение
3. Асинхронный
запуск
произвольного
метода
При разработке программного обеспечения наиболее часто требуется
запускать асинхронно собственные методы. В .NET Framework можно
асинхронно вызывать любой метод. Для
этого необходимо определить
делегат с той же сигнатурой, что и у вызываемого метода.
Среда CLR автоматически определяет для этого делегата методы
Достарыңызбен бөлісу: