2009-08-27 66 views
2

我有一个Winform应用程序,它列出了gridview中的一批发票。用户选择该批次并单击按钮“生成发票”。该过程大约需要4-5分钟。在运行时,我将有一个选取框进度条,并希望禁用所有按钮。后台工作进程或线程?

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

回答

5

这是BackgroundWorker所指的任务的确切类型。你应该把它推入一个后台工作者,并允许它运行。这提供了一个简单的方法来更新您的进度条等。

没有理由为此创建自己的线程。通过BackgroundWorker的ThreadPool可以很好地工作。

+0

背景工作者是否使用框架中的相同线程池?为什么不直接使用threadpool呢? – RollRoll 2013-01-31 03:59:01

+1

@ThePoet它使用相同的线程池。它提供了很多功能,用于自动编组进度和完成回到初始同步情况下,虽然。如果你使用'ThreadPool.QueueUserWorkItem',你必须自己进行编组,这更容易出错。 – 2013-01-31 18:35:33

-1

如果你在worker中有内存泄漏,肯定是后台进程。

+1

这里没有提到泄漏...... – 2009-08-27 19:39:12

+0

内存泄漏进入它的地方 - 留在点上。 ]。 – MoonKnight 2011-10-11 13:44:08

3

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

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

1

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

1

后台工作人员更容易,并为您的案件(check the first few lines of msdn)准确设计。

所以我会按照KISS原则:)

其实后台工作,甚至比正常快线! 因为它由线程池支持,所以它避免了昂贵的线程重新创建。

关于通过Jaimal Chohan提到的限制:由于后台工作由线程池支持它拥有25并行任务的限制,但应足以让任何GUI应用程序了。 (如果你以某种方式超过这个数字,进一步的任务将简单地等待其他任务完成)