BackgroundWorker与线程使用
2015-09-06 21:55
148 查看
在一个程序中,一些耗时的操作,在长时间运行时可能会导致用户界面(UI)处于停止响应状态,用户在这操作期间无法进行其他的操作,为了不使UI层处于停止响应状态,需要将这些耗时的操作,设置为后台线程,并且在UI层可以展示后台操作的进度,比较常用的方法有使用线程以及BackgroundWorker类。
1、线程方法
当我们要在前太展示后台的操作进程时,是不允许跨线程访问控件。此时需要取消控件的跨线程访问,在winform中可以设置CheckForIllegalCrossThreadCalls=false,而在wpf中不存在CheckForIllegalCrossThreadCalls这个属性,在这介绍一种方法,取消跨线程访问,在wpf中有Dispatcher属性使用委托的方法来告诉控件需要做什么。
Threadth=newThread(()=>{
for(inti=0;i<=100;i++)
{
CrossThread(i);//将执行的进度汇报给UI层的控件
Thread.Sleep(100);
}
});
th.IsBackground=true;
th.Start();
当点击开始按钮时进度条就会显示进度
2、使用BackgroundWorker
BackgroundWorker类允许在单独的专用线程上运行操作,使用BackgroundWorker需要引用System.ComponentModel
BackgroundWorker有三个重要的事件
this.bgWorker.DoWork+=newDoWorkEventHandler(backgroundWorker_DoWork);
this.bgWorker.RunWorkerCompleted+=newRunWorkerCompletedEventHandler(backgroundWorker_RunWorkerCompleted);
this.bgWorker.ProgressChanged+=newProgressChangedEventHandler(backgroundWorker_ProgressChanged);
DoWork(),将需要处理的后台操作放入DoWork()中
ProgressChanged调用ReportProgress时发生
RunWorkerCompleted后台操作执行完成时或取消时发生
在使用BackgroundWorker报告后台的进度时需要将WorkerReportsProgress设置为true,否则在bk.ReportProgress(p)报告进度是会抛出异常
以上只是个人使用的总结,不是很全面,希望大家补充,有错误的地方希望能够指出
在MSDN中有对BackgroundWorker的详细的讲解https://msdn.microsoft.com/zh-cn/library/system.componentmodel.backgroundworker.aspx
1、线程方法
当我们要在前太展示后台的操作进程时,是不允许跨线程访问控件。此时需要取消控件的跨线程访问,在winform中可以设置CheckForIllegalCrossThreadCalls=false,而在wpf中不存在CheckForIllegalCrossThreadCalls这个属性,在这介绍一种方法,取消跨线程访问,在wpf中有Dispatcher属性使用委托的方法来告诉控件需要做什么。
publicAction<int>proBarDel;//先定义一个委托 ///<summary> ///取消夸线程访问 ///</summary> ///<paramname="str"></param> privatevoidCrossThread(inti) { //取消控件夸线程访问 proBarDel=this.GetReceive; this.pb.Dispatcher.Invoke(proBarDel,i); this.lab1.Dispatcher.Invoke(proBarDel,i); } ///<summary> ///为控件设置内容 ///</summary> ///<paramname="receiveStr"></param> publicvoidSetValue(intreceive) { pb.Value=receive; lab1.Content=receive; } //在按钮的点击事件中新增一个线程
Threadth=newThread(()=>{
for(inti=0;i<=100;i++)
{
CrossThread(i);//将执行的进度汇报给UI层的控件
Thread.Sleep(100);
}
});
th.IsBackground=true;
th.Start();
当点击开始按钮时进度条就会显示进度
2、使用BackgroundWorker
BackgroundWorker类允许在单独的专用线程上运行操作,使用BackgroundWorker需要引用System.ComponentModel
BackgroundWorker有三个重要的事件
this.bgWorker.DoWork+=newDoWorkEventHandler(backgroundWorker_DoWork);
this.bgWorker.RunWorkerCompleted+=newRunWorkerCompletedEventHandler(backgroundWorker_RunWorkerCompleted);
this.bgWorker.ProgressChanged+=newProgressChangedEventHandler(backgroundWorker_ProgressChanged);
DoWork(),将需要处理的后台操作放入DoWork()中
BackgroundWorkerbgWorker=newBackgroundWorker();//创建一个BackgroundWorker
///<summary>
///需要处理的事件
///</summary>
///<paramname="sender"></param>
///<paramname="e"></param>
privatevoidbackgroundWorker_DoWork(objectsender,DoWorkEventArgse)
{
e.Result=DoWork(bgWorker,e);
}
privateboolDoWork(BackgroundWorkerbk,DoWorkEventArgse)
{
intnum=(int)e.Argument;//
intp=0;
for(inti=0;i<num;i++)
{
if(bk.CancellationPending)//判断是否取消后台操作
{
returnfalse;
}
else
{
p=(int)(((double)i/(double)num)*100);
bk.ReportProgress(p);//报告进度
Thread.Sleep(100);
}
}
returntrue;
}
ProgressChanged调用ReportProgress时发生
privatevoidbackgroundWorker_ProgressChanged(objectsender,ProgressChangedEventArgse)
{
proBar.Value=e.ProgressPercentage;//获得进度给进度条
this.lab1.Content=e.ProgressPercentage;
}
RunWorkerCompleted后台操作执行完成时或取消时发生
///<summary>
///处理完成
///</summary>
///<paramname="sender"></param>
///<paramname="e"></param>
privatevoidbackgroundWorker_RunWorkerCompleted(objectsender,RunWorkerCompletedEventArgse)
{
MessageBox.Show("ok");
}
在使用BackgroundWorker报告后台的进度时需要将WorkerReportsProgress设置为true,否则在bk.ReportProgress(p)报告进度是会抛出异常
以上只是个人使用的总结,不是很全面,希望大家补充,有错误的地方希望能够指出
在MSDN中有对BackgroundWorker的详细的讲解https://msdn.microsoft.com/zh-cn/library/system.componentmodel.backgroundworker.aspx
相关文章推荐
- 黑马程序员————java基础————正则表达式
- jdk,jre与jvm的区别与联系
- 大数问题
- 腾讯笔试题
- c++遍历查找文件夹路径下的所有文件(比如.txt) 使用的是MFC的CFileFind类
- MATLAB入门教程
- 程序员的人生规划
- kickstart配置文件详解
- 论管理系统
- 实现随即颜色(js)
- C/C++内存泄漏及检测
- JAVA Io 缓冲输入输出流
- iOS KVC详解
- python的SimpleHTTPServer
- 内存对齐机制
- jsp使用自定义类
- bootstrap学习记录(慕课网教程)
- Eclipse快捷键大全
- python-selenium Page Object设计模式
- 个人简介