精易论坛
标题:
超好用的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;
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。
WpfApp1.rar
2018-3-5 14:16 上传
点击文件名下载附件
下载积分: 精币 -2 枚
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