精易论坛

标题: 超好用的BackgroundWorker [打印本页]

作者: 武汉豆豆    时间: 2018-3-5 14:19
标题: 超好用的BackgroundWorker
在System.ComponentModel名称空间下,BackgroundWorker是对线程的封装,非常好用,它有二个重要的属性,WorkerSupportsCancellation=True表示线程支持取消架构,WorkerReportsProgress=True表示线程可以通知进度。三个重要的事件,DoWork是最主要的事件,不能在这个事件里访问界面,在ProgressChanged事件里可以访问界面,参数E.ProgressPercentage表示进度,是个int类型,RunWorkerCompleted 事件表示运行结束,在这个事件里可以做点收尾工作。
下面展示一下BackgroundWorker有多么的易用,先实例二个BackgroundWorker对象worker1和worker2,worker1.WorkerSupportsCancellation = true;
            worker1.WorkerReportsProgress = true;
  1. worker1.DoWork += (sender, e) =>
  2.              {
  3.                  for (int i = 1; i <= 100; i++)
  4.                  {
  5.                      if (worker1.CancellationPending)
  6.                          return;
  7.                      worker1.ReportProgress(i, i.ToString());
  8.                      Task.Delay(600).Wait();
  9.                  }
  10.              };
复制代码
然后添加DoWork事件,用lamda书写更简单,sender是object类型参数,e是DoWorkEventArgs类型参数,写一个循环,从1-100,在循环中判断是否取消,如果取消就返回,if (worker1.CancellationPending) return; 然后报告进度 worker1.ReportProgress(i, i.ToString()); 第一个参数是整数进度百分比,第二个参数是一个object对象,可以传任意对象。
  1. worker1.ProgressChanged += (sender, e) =>
  2.              {
  3.                  lstInteger.Items.Add(e.UserState as string);
  4.                  lstInteger.ScrollIntoView(lstInteger.Items[lstInteger.Items.Count - 1]);
  5.              };
复制代码
然后添加进度事件,在事件里访问界面里的整数列表ListBox,

  1. worker1.RunWorkerCompleted += (sender, e) =>
  2.              {
  3.                  Execute.IsEnabled = true;
  4.                  Cancel.IsEnabled = false;
  5.              };
复制代码
然后添加完成事件,做些收尾工作,Execute和Cancel是二个按钮。
worker2与worker1是一样的,让这二个线程同时访问界面列表ListBox,在代码里没有锁,不会有任何问题。
初始化二个对象后,可以调用worker1.RunWorkerAsync();worker2.RunWorkerAsync();运行线程,要取消线程可以调用worker1.CancelAsync(); worker2.CancelAsync();完整代码见附件,编译平台visual studio 2017。


WpfApp1.rar

45.75 KB, 下载次数: 3, 下载积分: 精币 -2 枚

例子


作者: 93543793    时间: 2018-3-5 14:56
提示: 作者被禁止或删除 内容自动屏蔽
作者: 风九幽    时间: 2018-6-3 15:40
没事过来 悄悄




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4