1.这个控件是不是创建一个单独的线程执行操作?
2.这个控件貌似只能开始和取消,不能暂停吧?
3.这个控件能满足下面四个问题么?
谢谢指教
那么线程相关的问题大致有如下四类(这篇文章只讨论单线程、单线程与UI线程这两方面的问题)。问题一,线程的基本操作,例如:暂停、继续、停止等;问题二,如何向线程传递参数或者从中得到其返回值;问题三,如何使线程所占用的CPU不要老是百分之百;最后一个,也是问题最多的,就是如何在子线程来控制UI中的控件,换句话说,就是在线程中控制窗体某些控件的显示。
2.这个控件貌似只能开始和取消,不能暂停吧?
3.这个控件能满足下面四个问题么?
谢谢指教
那么线程相关的问题大致有如下四类(这篇文章只讨论单线程、单线程与UI线程这两方面的问题)。问题一,线程的基本操作,例如:暂停、继续、停止等;问题二,如何向线程传递参数或者从中得到其返回值;问题三,如何使线程所占用的CPU不要老是百分之百;最后一个,也是问题最多的,就是如何在子线程来控制UI中的控件,换句话说,就是在线程中控制窗体某些控件的显示。
有这样一个应用:客户需要把大量数据(需要执行3天)copy到另外一个机器,中间想能看到有多少数据被复制/失败等(实时报道)。在这个例子里面,我们的界面可能非常简单:一个开始按钮,一个结束按钮,一个richtextBox来显示运行记录。但是后台执行可能就会比较棘手。如果简单的执行,并且报告,那么整个界面将失去响应(都在同一个线程里面,造成忙碌)。这时候,可以使用这个backgroundworker了。它可以在后台执行,并且报告给界面实时信息,界面不会失去响应。 先介绍一下backgroundworker的几个属性/方法 .WorkerReportsProgress:是否可以向外报告进度。 .WorkerSupportsCancellation :是否可以暂停任务 . CancellationPending: 是否正在暂停中 . RunWorkerAsync() : 开始执行任务。触发DoWork事件 . ReportProgress(int percentPrgress,object userState) : 向外报告进度。触发ProgressChanged事件.其中,参数可以在ProgressChangedEventArgs(worker_ProgressChanged(object sender, ProgressChangedEventArgs e))中得到 . CancelAsync() :取消(暂停)执行。 事件 worker.DoWork += new DoWorkEventHandler(worker_DoWork);//执行任务 worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);//任务结束时 worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged)//报告状态 按照上边的资料,我们这个应用就可以这样处理之 formDisplay是用于显示实时状态的窗口。有DisplyMessage方法来显示信息到界面 在Hanlder类(处理文件copy的)里面: static void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) { //show the message on windows formDisplay.DisplyMessage(“copy”, e.UserState.ToString());//show message. } static void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { string msg = "JOB copy : have been completed"; formDisplay.DisplyMessage(msg);//show message } static void worker_DoWork(object sender, DoWorkEventArgs e) { for(…) { //copying (sender as BackgroundWorker). ReportProgress(0,”xxx complete”);//report} }这样构造的程序里面,才不会出现UI失去响应。当然,通过写自己的异步处理也可以实现,功能更强大。只不过这个用起来更简单。
backgroundWorker1.ReportProgress(int ,object)用于向主线层报告进度
backgroundWorker1.RunWorkerAsync():用于开始执行异步操作
backgroundWorker1.IsBusy 后台是否会执行
backgroundWorker1.WorkerReportsProgress 声明异步执行时是否可以报告进度
backgroundWorker1.WorkerSupportsCancellation 声明是否可以异步取消
backgroundWorker1.CancellationPending 是否取消异步执行
[url=http://www.cnblogs.com/lexus/archive/2008/08/27/1277956.html]参考[/url]
参考
可以使用ManualResetEvent来实现。