【发布时间】:2012-10-25 04:10:29
【问题描述】:
阅读这些BackgroundWorker vs. ThreadPool vs. Thread 提示后,我决定选择BackgroundWorker。
我知道如何通过将其组件从工具箱拖放到我的表单中来创建这样一个线程,但由于我需要多个这样的线程(10-20 之间的有限数量),我不确定什么是正确的解决方法是:
- 拖放其中的 10-20 个,在代码中为它们创建占位符,但仅启动需要运行的那些,具体取决于应用程序的需求(在不同的场景中,我可以运行这 10-2 个中的 1-2 个) 20 个线程)。
或
- 以编程方式创建BackgroundWorkers(涉及更多)
我更喜欢拖放方法,但我在 BackgroundWorker 方面没有经验,我不确定要权衡什么。
有经验的 BackgroundWorker 程序员有什么建议吗?
【问题讨论】:
-
您是否也考虑过任务(.NET 4)?
-
知道工人会做什么会有所帮助。
-
@ateiob 它们是由不同的用户操作引起的,还是你按一个按钮然后全部启动?
-
@ateiob 如果您正在轮询,那么它们确实应该是计时器,您担心它们是否在后台运行是正确的。有几个计时器可供选择。如果您使用 Windows.Forms.Timer,则
Tick事件在 UI 线程中运行;您需要使用异步 IO 方法,使用 async 关键字(如果您有 .NET 4.5,这将是最佳选择)或执行其他操作以移动到后台线程。或者您可以只使用任何其他计时器,因为它们的事件不会在 UI 线程中触发。 -
@ateiob 好吧,如果您将
CheckForIllegalCrossThreadCalls设置为 false 则不,它不会总是抛出异常,它只是 可能抛出例外或无法以某种微妙的方式工作。一种简单的检查方法是只睡 5 秒钟;如果表单冻结你在 UI 线程中,如果不是你不是。如果您不是(而且您不应该),那么您需要能够编组回 UI 线程,以便在准备好时使用结果更新控件。使用Control.Invoke来做到这一点。
标签: c# winforms backgroundworker