【问题标题】:Is there a way to send data to a BackgroundWorker after it has been started?有没有办法在启动后将数据发送到 BackgroundWorker?
【发布时间】:2009-09-03 16:41:30
【问题描述】:

我知道你可以在第一次启动后台工作程序时通过 RunWorkerAsync 函数调用传递参数,但是你可以在它已经启动后传递数据吗?或者我是否需要创建自己的并发形式来处理从不同线程向其传递数据?

【问题讨论】:

    标签: c# multithreading concurrency parameters backgroundworker


    【解决方案1】:

    您需要添加一些同步,并为后台工作人员提供一个从中读取数据的位置。

    您不能(轻松)向后台工作人员发送数据。有一个工作人员可以查找数据的地方要容易得多,您只需添加数据进行处理。只需确保在这一点上进行同步,因为(至少)两个线程可能会同时访问数据。

    【讨论】:

    • 这就是我的想法,还有比 Skeets 先生更好的生产者/消费者示例吗? yoda.arachsys.com/csharp/threads/deadlocks.shtml
    • 他是一个非常干净、严格的选择。在某些情况下,可以使用 ReaderWriterLock 代替,这可能会更好(但仅在某些情况下),因为它不会阻止读者。见:msdn.microsoft.com/en-us/library/…
    • 太好了,我会检查一下,看看我是否可以使用它。谢谢
    • 来自 SwDevMan81 的解决方案,乍一看,看起来是错误的。我看到两个线程同时访问同一个队列。入队和出队不应该在临界区吗?
    • @Eyal:Jon Skeet 的帖子确实处理正确。 enqueue 和 dequeue 调用在锁 [lock (listLock)] 内,一切正常。
    【解决方案2】:

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

    但是,工作例程只是在不同的线程上运行。您可以像在 2 个任意线程之间传递数据一样将数据传递给该线程。关于如何...

    • 静态变量的状态变化(可能是邪恶的)
    • 最初传递给工作例程的对象的状态更改(如果控制不当,仍然有点邪恶)

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

    【讨论】:

      【解决方案3】:

      我更喜欢使用一个静态队列,它是定期检查新消息的后台线程。这允许后台线程按照自己的节奏工作。您可以使用回调方法向主线程发出信号。就像 Reed 说的那样,使用同步,比如锁定一个静态对象。

      【讨论】:

        猜你喜欢
        • 2017-02-08
        • 1970-01-01
        • 2015-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-31
        • 1970-01-01
        相关资源
        最近更新 更多