【发布时间】:2009-08-27 19:27:48
【问题描述】:
我有一个 Winform 应用程序,它在网格视图中列出了一批发票。用户选择批次并单击“生成发票”按钮。该过程大约需要4-5分钟。当它正在运行时,我将有一个选框进度条,并希望禁用所有按钮。
我应该使用 BackgroundWorker 进程还是创建一个新线程来运行此任务?
【问题讨论】:
我有一个 Winform 应用程序,它在网格视图中列出了一批发票。用户选择批次并单击“生成发票”按钮。该过程大约需要4-5分钟。当它正在运行时,我将有一个选框进度条,并希望禁用所有按钮。
我应该使用 BackgroundWorker 进程还是创建一个新线程来运行此任务?
【问题讨论】:
这正是 BackgroundWorker 所指的任务类型。您应该将其推送到后台工作程序中,并允许它运行。这提供了一种更新进度条等的简单方法。
没有理由为此创建自己的线程。通过 BackgroundWorker 的 ThreadPool 将运行良好。
【讨论】:
ThreadPool.QueueUserWorkItem,则必须自己进行编组,这样更容易出错。
后台工作进程的线程数量有限(20 或 25 个,具体记不清了),使用其中一个会使该线程停止运行 4-5 分钟。通常建议不要将后台工作进程用于长时间运行的任务,但是如果您一次只运行一个线程,这并不是真正的问题。
在理想情况下,我可能会创建自己的线程,但这需要努力和理解。
【讨论】:
单独的进程当然会更安全:如果它有任何问题(崩溃、无限循环、泄漏或其他) - 这些问题不会影响父进程。
【讨论】:
后台工作人员更容易,并且专为您的情况设计(check the first few lines of msdn)。
所以我会遵循 KISS 原则 :)
实际上后台工作线程比普通线程还要快! 因为它由线程池支持,所以它避免了昂贵的线程重新创建。
关于 Jaimal Chohan 提到的限制:因为后台工作程序由线程池支持,所以它有 25 个并行任务的限制,但这对于任何 gui 应用程序来说应该足够了。 (如果你以某种方式超过了这个数字,进一步的任务将只是等待其他人完成)
【讨论】:
如果工作进程中存在内存泄漏,肯定是后台进程。
【讨论】: