|
在System.ComponentModel名称空间下,BackgroundWorker是对线程的封装,非常好用,它有二个重要的属性,WorkerSupportsCancellation=True表示线程支持取消架构,WorkerReportsProgress=True表示线程可以通知进度。三个重要的事件,DoWork是最主要的事件,不能在这个事件里访问界面,在ProgressChanged事件里可以访问界面,参数E.ProgressPercentage表示进度,是个int类型,RunWorkerCompleted 事件表示运行结束,在这个事件里可以做点收尾工作。
下面展示一下BackgroundWorker有多么的易用,先实例二个BackgroundWorker对象worker1和worker2,worker1.WorkerSupportsCancellation = true;
worker1.WorkerReportsProgress = true;
- worker1.DoWork += (sender, e) =>
- {
- for (int i = 1; i <= 100; i++)
- {
- if (worker1.CancellationPending)
- return;
- worker1.ReportProgress(i, i.ToString());
- Task.Delay(600).Wait();
- }
- };
复制代码 然后添加DoWork事件,用lamda书写更简单,sender是object类型参数,e是DoWorkEventArgs类型参数,写一个循环,从1-100,在循环中判断是否取消,如果取消就返回,if (worker1.CancellationPending) return; 然后报告进度 worker1.ReportProgress(i, i.ToString()); 第一个参数是整数进度百分比,第二个参数是一个object对象,可以传任意对象。
- worker1.ProgressChanged += (sender, e) =>
- {
- lstInteger.Items.Add(e.UserState as string);
- lstInteger.ScrollIntoView(lstInteger.Items[lstInteger.Items.Count - 1]);
- };
复制代码 然后添加进度事件,在事件里访问界面里的整数列表ListBox,
- worker1.RunWorkerCompleted += (sender, e) =>
- {
- Execute.IsEnabled = true;
- Cancel.IsEnabled = false;
- };
复制代码 然后添加完成事件,做些收尾工作,Execute和Cancel是二个按钮。
worker2与worker1是一样的,让这二个线程同时访问界面列表ListBox,在代码里没有锁,不会有任何问题。
初始化二个对象后,可以调用worker1.RunWorkerAsync();worker2.RunWorkerAsync();运行线程,要取消线程可以调用worker1.CancelAsync(); worker2.CancelAsync();完整代码见附件,编译平台visual studio 2017。
|
|