gpt4 book ai didi

.net - 如何将工作项分派(dispatch)到单个线程

转载 作者:行者123 更新时间:2023-12-01 12:00:25 25 4
gpt4 key购买 nike

抱歉,这个问题不是很清楚,如果我知道描述问题的正确词语,Google 很可能会得出答案。

我正在寻找一个队列类:

  • 允许任意数量的线程将一个项目放入队列
  • 项目按照它们被添加到队列中的顺序进行处理
  • 我不介意哪个线程处理一个项目
  • 一次只处理一项。
  • 如果队列中没有项目,我宁愿不让线程阻塞等待将项目添加到队列中。
  • 正常情况下队列大部分时间都是空的。

例如,就像 WinForms 窗口上的 BeginInvoke 发生的情况一样...(或者 PostMessage,如果您完成了所有原始 win32 编程)我们正在使用 .net 3.5

我正在寻找 .net 框架中现成的东西,或者一个具有良好单元测试的开源项目,因为我不想为自制解决方案编写所有单元测试。


有关背景,请参阅 Why are my message be processed out of order over a single WCF TCP channel (with ConcurrencyMode.Reentrant)?通过使用这个 depatcher,我能够更改为使用 ConcurrencyMode.Single 并且仍然避免死锁。

最佳答案

这是一个可以做到这一点的类的草图:

public class WorkerQueue<T> {
private Queue<T> workerQueue = new Queue<T>();
private object padlock = new object();
private bool isProcessing = false;
private Thread workerThread;

public void QueueWorkItem(T item) {
lock(padlock) {
workerQueue.Enqueue(item);
if (!isProcessing) {
isProcessing = true;
workerThread = new Thread(() => { this.ProcessWork });
workerThread.Start();

}
}
}

private void ProcessWork() {
// 1) Thread-safe dequeue operation
// 2) Keep processing while work is on the queue. External callers can
// add items to the queue while this is ongoing.
// 3) When the queue is empty, set isProcessing to false (thread-safely)
}

}

应用程序会像这样使用它:

public class Application {
private WorkerQueue<object> workerQueue = new WorkerQueue<object>();

// This can run on multiple threads if need be
public void SomeMethodThatCreatesWork() {
object workItem = ExternalCall();
this.workerQueue.QueueWorkItem(workItem);
}
}

让应用程序也停止处理可能会有用,可能是通过添加一个标志,ProcessWork 可以在每个项目出队后进行检查,但不清楚如何处理未处理的项目(也许允许访问它们并让调用者决定就足够了。

关于.net - 如何将工作项分派(dispatch)到单个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2319899/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com