【问题标题】:Assigning jobs to BackgroundWorker thread one at a time一次将作业分配给 BackgroundWorker 线程
【发布时间】:2011-09-16 15:09:01
【问题描述】:

我的 silverlight 应用程序从 web 服务(异步)获取 文件集。 webservice 方法接受文件名数组并返回文件集(也作为数组)。 silverlight 客户端对 文件集 提出了几个这样的请求。

客户端一次向网络服务发出许多请求。我需要在客户端一个 BackgroundWorker 线程来处理收到的文件集 一个接一个

我如何收集所有文件集,当他们收到这些文件集并将这些文件集提供给BackgroundWorker 线程时,一次一个。

编辑: 我无法运行多个 BackgorundWorker,因为文件集处理模块不是线程安全的。

【问题讨论】:

标签: c# .net silverlight backgroundworker


【解决方案1】:

使用BlockingCollection / ConcurrentQueue 保存有关要处理的文件集的信息...在后台工作人员中,您只有while 循环将下一个文件集出列并处理它...提到的集合是线程安全且速度非常快,因为大多数操作都是无锁实现的......

【讨论】:

  • 可能存在并发队列为空且等待被填充的情况。当worker尝试出队时会不会有问题?
  • 不会有问题 - 要么它在 TryDequeue (ConcurrentQueue) / TryTake (BlockingCollection) 上返回 false,要么它会一直休眠直到有东西填满 Take ( BlockingCollection) - 请点击链接...
  • @codr3:这些选项在 Silverlight 中都不可用(除非您自己编写)
  • 找到了一个适合我的 Silverlight 移植并发队列。
【解决方案2】:

backgroundworker 没有内置的监听机制。它应该执行一个长时间的操作并终止。

一种解决方案可能包括为每个文件集启动一个backgroundworker

如果这些文件集的处理必须同步,您可以决定将每个请求推入队列(基本上是array。确保同步访问它)。每当您 backgroundworker 处理完一个文件集时,它都会向主线程(ProgressChanged event IIRC)报告并循环遍历数组中更多可能的请求。只要数组为空,worker就退出。

但请注意:如果工作人员在您发送请求时退出,您将遇到问题。这就是为什么基本线程可能比后台线程更强大的原因,尤其是在您不知道是否会有更多文件集要处理的情况下。这完全取决于您的工作流程。

【讨论】:

  • 我无法运行多个 BackgorundWorkers,因为文件集处理模块不是线程安全的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
相关资源
最近更新 更多