Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winforms 后台工作进程还是线程?_Winforms_Multithreading - Fatal编程技术网

Winforms 后台工作进程还是线程?

Winforms 后台工作进程还是线程?,winforms,multithreading,Winforms,Multithreading,我有一个Winform应用程序,它在gridview中列出了一批发票。用户选择批次并单击按钮“生成发票”。这个过程大约需要4-5分钟。当这是运行时,我将有一个字幕进度条,并想禁用所有按钮 我应该使用BackgroundWorker进程还是创建一个新线程来运行此任务?如果工作进程中存在内存泄漏,当然是后台进程。后台工作进程的线程数有限(20或25个,记不清),使用其中一个线程将使该线程停止运行4-5分钟。一般来说,建议不要在长时间运行的任务中使用后台工作进程,但是如果一次只运行一个线程,这并不是一

我有一个Winform应用程序,它在gridview中列出了一批发票。用户选择批次并单击按钮“生成发票”。这个过程大约需要4-5分钟。当这是运行时,我将有一个字幕进度条,并想禁用所有按钮


我应该使用BackgroundWorker进程还是创建一个新线程来运行此任务?

如果工作进程中存在内存泄漏,当然是后台进程。

后台工作进程的线程数有限(20或25个,记不清),使用其中一个线程将使该线程停止运行4-5分钟。一般来说,建议不要在长时间运行的任务中使用后台工作进程,但是如果一次只运行一个线程,这并不是一个真正的问题


在理想情况下,我可能会创建自己的线程,但这需要努力和理解。

一个单独的进程当然会更安全:如果它有任何问题(崩溃、无限循环、泄漏等)-这些问题不会影响父进程。

这正是BackgroundWorker要处理的任务类型。您应该将其推入后台工作程序,并允许其运行。这提供了一种更新进度条等的简单方法


没有理由为此制作自己的线程。通过BackgroundWorker的线程池将非常好地工作。

后台工作程序更简单,并且完全是为您的情况而设计的

所以我会遵循接吻原则:)

事实上,后台工作线程甚至比普通线程更快! 因为它由线程池支持,所以它避免了昂贵的线程重新创建

关于Jaimal Chohan提到的限制:因为后台工作程序由线程池支持,所以它有25个并行任务的限制,但这对于任何gui应用程序都应该足够了。
(如果您以某种方式超过了该数目,进一步的任务将只需等待其他人完成)

后台工作人员是否使用来自框架的相同线程池?那么为什么不直接使用threadpool呢?@ThePoet它确实使用相同的threadpool。不过,它提供了很多功能,可以自动将进度和完成封送回初始同步上下文。如果使用
ThreadPool.QueueUserWorkItem
,则必须自己进行封送处理,这更容易出错。