有没有办法在启动后将数据发送到BackgroundWorker?

问题描述:

我知道你可以在第一次启动backgroundworker时通过RunWorkerAsync函数调用传递参数,但是你可以在数据已经启动后传递它吗?或者,我是否需要创建自己的并发形式来处理从其他线程传递给它的数据?有没有办法在启动后将数据发送到BackgroundWorker?

您需要添加一些同步,并让后台工作人员从中读取数据。

您不能(轻松地)将数据发送给后台工作人员。只需要有一个工作人员可以查找数据的地方,并且只需添加数据即可处理。因为(至少)两个线程可能在同一时间访问数据,所以请确保在该点上进行同步。

+0

这就是我认为的,那么Skeets先生有没有更好的生产者/消费者的例子? http://www.yoda.arachsys.com/csharp/threads/deadlocks.shtml – SwDevMan81 2009-09-10 11:38:04

+0

他是一个非常干净,狭隘的选择。在某些情况下,可能会使用ReaderWriterLock,这可能会更好(但只在某些情况下),因为它不会阻止读者。请参阅:http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlock.aspx – 2009-09-10 11:40:40

+0

太好了,我会检查一下,看看我能否使用它。谢谢 – SwDevMan81 2009-09-10 11:43:53

在任务启动后,BackgroundWorker API内不支持传递额外数据的机制。

但是,工作程序只是在不同的线程上运行。您可以将数据传递到该线程,就像在两个任意线程之间传递数据一样。一对夫妇对如何简单的例子......在静态变量

  • 状态变化(可能是邪恶的)开始向下传递到工人日常的对象
  • 状态改变(还是有点邪如果控制不当)

您应该仔细考虑这些方法的同步影响。

我更喜欢使用静态队列来定期检查新消息的后台线程。这允许后台线程按照自己的步调工作。您可以使用回调方法发回主线程。就像里德所说的,使用同步,比如一个静态对象来锁定。