Образования и науки российской федерации



Pdf көрінісі
бет32/56
Дата13.03.2023
өлшемі0.74 Mb.
#470699
1   ...   28   29   30   31   32   33   34   35   ...   56
BackgroundWorker. Вам предстоит добавить к приложению компонент 
BackgroundWorker и написать отнимающий продолжительное время 


44 
метод, который будет выполняться в отдельном потоке. Затем вы 
сообщите о продвижении потока и реализуете функциональность отмены 
фонового процесса. 
1. Создайте 
новый 
проект 
Windows 
Forms. 
Назовите 
его 
WinBackgroundWorker. 
2. Добавьте на форму элементы управления: два элемента Label
TextBoxProgressBar и две кнопки 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 автоматически определяет для этого делегата методы 


Достарыңызбен бөлісу:
1   ...   28   29   30   31   32   33   34   35   ...   56




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет