C#主线程中启用子线程,需要在主线程中显示子线程的进度

时间:2023-01-01 18:21:36
如题,主线程是一个winform窗体,有一个操作比较费时,所以启用了一个后台进行BackgroundWorker来完成此操作。这样可以不影响主线程的运行。问题是,现在我需要在主界面中能够看到该子线程的执行情况,如何做?

BackgroundWorker有DoWork事件,可以开始执行后台异步操作
ProgressChanged可以报告进度,但是需要调用ReportProgress方法才会报告一次,如何一直报告


简单点说,后台子进行在执行之中,主线程中需要知道此进程执行的进度,如何做?可否给出示例代码?感谢

9 个解决方案

#1


只有子线程自己知道自己干的活到了什么进度,因此才需要它去通知主线程进度。而何时通知进度也只有编码的人才知道,别人怎么知道你想在什么时候通知主线程呢?
比如读1000个文件,有人像每读完10个文件就通知一次,每次进度就前进1%;而有的人想每度完5个文件就通知一次,每次进度前进0.5%。完全取决于你个人。

#2


引用 楼主 feiyuekongjian 的回复:
但是需要调用ReportProgress方法才会报告一次,如何一直报告

一直调用ReportProgress方法即可

#3


引用 1 楼 Libby1984 的回复:
只有子线程自己知道自己干的活到了什么进度,因此才需要它去通知主线程进度。而何时通知进度也只有编码的人才知道,别人怎么知道你想在什么时候通知主线程呢?


是这样的。

工作过程报告自己的“进度改变了”,那么监听事件的过程或者理睬它(显示或者记录下来),或者不理睬。总之是推送进度的,而不是什么读取进度的!

你要把这个逻辑想在头脑里,学到位。

#4


引用 楼主 feiyuekongjian 的回复:
简单点说,后台子进行在执行之中,主线程中需要知道此进程执行的进度,如何做?


主线程监听了进度报告,把每一次的报告结果记录下来,这就是它“知道了”进程执行进度。

不能理解事件监听的人,只知道“想当然地监控结果”的人,在软件设计基本技术上,学到头顶多也就是刚学了一半。你要全盘接受事件的设计思路。

#5


一直报什么意思,程序是可控的,显示的粒度自己设定

#6


子线程ReportProgress需要参数,该参数是后台进度百分比,问题是这个值是不知道的。我就是想要得到这个进度值,子线程在执行一个操作时,时间不确定,我希望用户在主线程中能看到当前子线程执行的进度到哪里了。

上面举的例子,比如上传1000个文件,自己定粒度,传了10个报告一次,这样当然知道报告100次就可以了。问题是我这个子线程就1个操作,这个操作时间不确定,我就是想知道这个操作当前进度到哪里了。
或者这样说,我做一个压缩文件的程序,在压缩文件的时候,想随时能看到当前压缩的进度到多少了,不需要剩余时间,只要能模拟显示比如当前操作完成30%,40%,60%这样的

#7


引用 4 楼 sp1234 的回复:
Quote: 引用 楼主 feiyuekongjian 的回复:

简单点说,后台子进行在执行之中,主线程中需要知道此进程执行的进度,如何做?


主线程监听了进度报告,把每一次的报告结果记录下来,这就是它“知道了”进程执行进度。

不能理解事件监听的人,只知道“想当然地监控结果”的人,在软件设计基本技术上,学到头顶多也就是刚学了一半。你要全盘接受事件的设计思路。

朋友,感谢你的回答,也许是我没表达清楚。不过也希望你能多看一看提问者的问题,不要老觉得问问题的就是有多差,有时候一个没怎么接触过的问题一时搞不明白也是有的。大家互相交流一下我觉得没什么不妥,即使问题再简单,又如何呢?谁没有一些在别人看起来很简单的问题。

#8


引用 2 楼 shingoscar 的回复:
Quote: 引用 楼主 feiyuekongjian 的回复:

但是需要调用ReportProgress方法才会报告一次,如何一直报告

一直调用ReportProgress方法即可

对,根据自己要报告的粒度,调用reportProgress方法

#9


引用 8 楼 johnliuyuan 的回复:
Quote: 引用 2 楼 shingoscar 的回复:

Quote: 引用 楼主 feiyuekongjian 的回复:

但是需要调用ReportProgress方法才会报告一次,如何一直报告

一直调用ReportProgress方法即可

对,根据自己要报告的粒度,调用reportProgress方法


你设置好粒度,然后使用ProgressChanged()方法就会report进度给你了。
http://blog.csdn.net/weixin_39730950/article/details/79417195 

#1


只有子线程自己知道自己干的活到了什么进度,因此才需要它去通知主线程进度。而何时通知进度也只有编码的人才知道,别人怎么知道你想在什么时候通知主线程呢?
比如读1000个文件,有人像每读完10个文件就通知一次,每次进度就前进1%;而有的人想每度完5个文件就通知一次,每次进度前进0.5%。完全取决于你个人。

#2


引用 楼主 feiyuekongjian 的回复:
但是需要调用ReportProgress方法才会报告一次,如何一直报告

一直调用ReportProgress方法即可

#3


引用 1 楼 Libby1984 的回复:
只有子线程自己知道自己干的活到了什么进度,因此才需要它去通知主线程进度。而何时通知进度也只有编码的人才知道,别人怎么知道你想在什么时候通知主线程呢?


是这样的。

工作过程报告自己的“进度改变了”,那么监听事件的过程或者理睬它(显示或者记录下来),或者不理睬。总之是推送进度的,而不是什么读取进度的!

你要把这个逻辑想在头脑里,学到位。

#4


引用 楼主 feiyuekongjian 的回复:
简单点说,后台子进行在执行之中,主线程中需要知道此进程执行的进度,如何做?


主线程监听了进度报告,把每一次的报告结果记录下来,这就是它“知道了”进程执行进度。

不能理解事件监听的人,只知道“想当然地监控结果”的人,在软件设计基本技术上,学到头顶多也就是刚学了一半。你要全盘接受事件的设计思路。

#5


一直报什么意思,程序是可控的,显示的粒度自己设定

#6


子线程ReportProgress需要参数,该参数是后台进度百分比,问题是这个值是不知道的。我就是想要得到这个进度值,子线程在执行一个操作时,时间不确定,我希望用户在主线程中能看到当前子线程执行的进度到哪里了。

上面举的例子,比如上传1000个文件,自己定粒度,传了10个报告一次,这样当然知道报告100次就可以了。问题是我这个子线程就1个操作,这个操作时间不确定,我就是想知道这个操作当前进度到哪里了。
或者这样说,我做一个压缩文件的程序,在压缩文件的时候,想随时能看到当前压缩的进度到多少了,不需要剩余时间,只要能模拟显示比如当前操作完成30%,40%,60%这样的

#7


引用 4 楼 sp1234 的回复:
Quote: 引用 楼主 feiyuekongjian 的回复:

简单点说,后台子进行在执行之中,主线程中需要知道此进程执行的进度,如何做?


主线程监听了进度报告,把每一次的报告结果记录下来,这就是它“知道了”进程执行进度。

不能理解事件监听的人,只知道“想当然地监控结果”的人,在软件设计基本技术上,学到头顶多也就是刚学了一半。你要全盘接受事件的设计思路。

朋友,感谢你的回答,也许是我没表达清楚。不过也希望你能多看一看提问者的问题,不要老觉得问问题的就是有多差,有时候一个没怎么接触过的问题一时搞不明白也是有的。大家互相交流一下我觉得没什么不妥,即使问题再简单,又如何呢?谁没有一些在别人看起来很简单的问题。

#8


引用 2 楼 shingoscar 的回复:
Quote: 引用 楼主 feiyuekongjian 的回复:

但是需要调用ReportProgress方法才会报告一次,如何一直报告

一直调用ReportProgress方法即可

对,根据自己要报告的粒度,调用reportProgress方法

#9


引用 8 楼 johnliuyuan 的回复:
Quote: 引用 2 楼 shingoscar 的回复:

Quote: 引用 楼主 feiyuekongjian 的回复:

但是需要调用ReportProgress方法才会报告一次,如何一直报告

一直调用ReportProgress方法即可

对,根据自己要报告的粒度,调用reportProgress方法


你设置好粒度,然后使用ProgressChanged()方法就会report进度给你了。
http://blog.csdn.net/weixin_39730950/article/details/79417195