从多个线程到一个同步线程的调度工作

Joh*_*ohn 6 .net c# multithreading

假设我有10个线程忙着做某事他们有时会调用一个方法

public HandleWidgets(Widget w) {  HeavyLifting(w) }
Run Code Online (Sandbox Code Playgroud)

但是,我不希望我的10个线程在HeavyLifting(w)上等待,而是将HeavyLifting(w)工作分配给第11个线程,即HeavyLifter线程并以异步方式继续.调度的HeavyLifter线程应该始终是同一个线程,我不想创建多个线程(因此,我不能做这样的事情:没有EndInvoke的C#异步调用?).

HeavyLifting(w)是"发射并忘记",因为调用HandleWidgets()的线程不需要回调或类似的东西.

这有什么健康的做法?

ta.*_*.is 1

基本上,您有一个线程是工作的生产者,还有一个线程是工作的使用者

创建一个线程并将其Take放入BlockingCollection循环中。这是您的消费者线程,它将调用HeavyLifting. 它只会等待,直到有一个项目可用,然后对其进行处理:

对 Take 的调用可能会阻塞,直到可以删除项目为止。

其他线程可以简单地将项目添加到集合中。

请注意,这BlockingCollection并不保证自行添加/删除的项目的顺序:

删除项目的顺序取决于用于创建 BlockingCollection 实例的集合类型。创建 BlockingCollection 对象时,可以指定要使用的集合类型