Advertisement
Guest User

Untitled

a guest
Mar 24th, 2019
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.34 KB | None | 0 0
  1. using System.Windows;
  2. using System.ComponentModel; // для BackgroundWorker
  3. using System.Threading;
  4.  
  5. namespace BackgroundWorkerSample
  6. {
  7. public partial class MainWindow : Window
  8. {
  9. // Задача объекта типа BackgroundWorker захватить свободный поток из пула потоков CLR и затем из
  10. // этого потока вызвать событие DoWork;
  11. BackgroundWorker _worker;
  12.  
  13. public MainWindow()
  14. {
  15. InitializeComponent();
  16.  
  17. _worker = new BackgroundWorker();
  18. // Метод, который будет выполнятся в отдельном потоке. Событие DoWork срабатывает при вызове RunWorkerAsync
  19. _worker.DoWork += new DoWorkEventHandler(worker_DoWork);
  20. // Метод, который сработает в момент завершения BackgroundWorker
  21. _worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
  22. // Событие для отслеживание процесса выполнения задачи BackgroundWorker. Событие возникает при вызове метода _worker.ReportProgress(i);
  23. _worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
  24. // Для отслеживания выполнения хода работ свойство WorkerReportsProgress устанавливаем true
  25. _worker.WorkerReportsProgress = true;
  26. // Поддержка отмены выполнения фоновой операции с помощью метода CancelAsync()
  27. _worker.WorkerSupportsCancellation = true;
  28. }
  29.  
  30. // Метод работает из потока Dispetcher. Он может получать доступ к переменным окна.
  31. void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
  32. {
  33. progressBar1.Value = e.ProgressPercentage;
  34. }
  35.  
  36. // Метод работает из потока Dispetcher. Он может получать доступ к переменным окна.
  37. void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  38. {
  39. this.Title = "Completed";
  40. MessageBox.Show("Completed");
  41. if (e.Cancelled)
  42. this.Title = "Cancelled";
  43. }
  44.  
  45. // Данный метод работает в отдельном потоке.
  46. void worker_DoWork(object sender, DoWorkEventArgs e)
  47. {
  48. for (int i = 0; i <= 100; ++i)
  49. {
  50. // Эмулируем трудоемкую задачу.
  51. Thread.Sleep(50);
  52.  
  53. // Отмена выполнения фоновой задачи, сработает при вызове CancelAsync
  54. if (_worker.CancellationPending)
  55. {
  56. e.Cancel = true; // значение нужно установить для того что бы при событии RunWorkerCompleted определить почему оно было вызвано, из-за того что закончилась операция или из-за отмены.
  57. return; // Отмена выполнения фоновой операции.
  58. }
  59. // Отчитываемся о проценте выполнения задачи.
  60. _worker.ReportProgress(i);
  61. }
  62. }
  63.  
  64. private void buttonStartWorker_Click(object sender, RoutedEventArgs e)
  65. {
  66. // Запуск выполнения фоновой операции. Событие DoWork.
  67. // Вторая перегрузка RunWorkerAsync позволяет передать объект событию DoWork для его последующей обработки в потоке.
  68. _worker.RunWorkerAsync();
  69. }
  70.  
  71. private void buttonCancel_Click(object sender, RoutedEventArgs e)
  72. {
  73. // Для работы метода, свойство WorkerSupportsCancellation должно быть равное true.
  74. _worker.CancelAsync();
  75. }
  76. }
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement