2010-02-12 43 views
2

我必须在Windows NT服务(使用.Net2.0/C#)中并行执行3个异步操作。为此我使用Backgroundworker组件。BackgroundWorker Thread - C#

  1. 这是一个很好的选择/方法吗?
  2. 对于连续操作,我在RunWorkerCompleted事件中再次调用RunWorkerAsync()。

请给我建议。

回答

1

通常BackgroundWorker用于长时间操作。如果你只需要并行执行3个任务,你可以使用简单的线程。

+0

所有这3个操作都是长时间操作。涉及很多处理。其中之一是将大型MB文件复制到文件夹位置。所以,我仍然应该采取正常的线程。我不是很清楚和自信。 – DotNetGuy 2010-02-12 17:03:56

+0

如果您不需要关于更改进度和任务完成的警报 - 则可以使用线程,否则使用后台工作程序。 – sashaeve 2010-02-12 17:33:11

1

通常情况下,当您需要RunWorkerCompleted在GUI中执行更新时,会使用BackgroundWorker。至少这是我一直在使用它的方式。这听起来像你想要不断运行,所以为什么不使用普通的工作线程?

我看到的最大问题是BackgroundWorker使用.NET线程池,所以如果您真的希望它持续运行,那么您只保证使用其中一个线程池线程,其中有一个线程池线程数量可用。

+0

使用线程池线程是错误的吗? – DotNetGuy 2010-02-12 17:02:24

+0

我认为这取决于。我现在一直都在使用它们,甚至没有使用普通的线程。但是你需要知道线程池线程的限制。 BackgroundWorker,Windows Workflow和我认为就委托使用BeginInvoke使用线程池。我敢打赌,在复杂的应用程序中运行起来非常容易。 – Dave 2010-02-12 20:32:44

+0

酷!在未来,如果我需要更新某种UI来描述这3个操作的进度,那么BckgrndWrkr会派上用场。 而且,您是否预见到在RunWorkerCompleted事件中再次调用RunWorkerAsync()时会遇到任何问题? – DotNetGuy 2010-02-13 10:32:41

0

我不会为你在这里描述的工作使用backgroundworkers。

后台工作人员的目的是用于一些“长期”运行操作,同时保持响应式用户界面。使用服务打破了UI模式。

对于服务我会使用一个计时器和三个线程。

让计时器检查三个线程的存在并重新启动它们或在需要时报告错误。这三个线程可以在while循环中完成他们自己的工作(不要忘记在那里添加一个睡眠(0))