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()的线程不需要回调或类似的东西.
这有什么健康的做法?
基本上,您有一个线程是工作的生产者,还有一个线程是工作的使用者。
创建一个线程并将其Take放入BlockingCollection循环中。这是您的消费者线程,它将调用HeavyLifting. 它只会等待,直到有一个项目可用,然后对其进行处理:
对 Take 的调用可能会阻塞,直到可以删除项目为止。
其他线程可以简单地将项目添加到集合中。
请注意,这BlockingCollection并不保证自行添加/删除的项目的顺序:
删除项目的顺序取决于用于创建 BlockingCollection 实例的集合类型。创建 BlockingCollection 对象时,可以指定要使用的集合类型