gpt4 book ai didi

c# - 如何创建自定义消息泵?

转载 作者:太空狗 更新时间:2023-10-30 01:06:35 24 4
gpt4 key购买 nike

我正在做一个小练习,我需要创建类似于消息泵的东西。我有一个待处理的工作队列,我希望工作完全在一个线程上完成,而任何线程都可以将工作添加到要完成的队列中。

Queue<WorkToDo> queue;

线程使用等待句柄告诉泵有工作要做。

WaitHandle signal;

只要有工作要做,泵就会循环,然后等待信号再次启动。

while(ApplicationIsRunning){
while(queue.HasWork){
DoWork(queue.NextWorkItem)
}
signal.Reset();
signal.WaitOne();
}

每个其他线程都可以将工作添加到队列并向等待句柄发出信号...

public void AddWork(WorkToDo work){
queue.Add(work);
signal.Set();
}

问题是,如果工作添加得足够快,可能会出现工作留在队列中的情况,因为在队列检查工作和 WaitHandle 重置之间,另一个线程可以将工作添加到队列中。

如果不在 WaitHandle 周围放置代价高昂的互斥锁,我将如何缓解这种情况?

最佳答案

您可以使用 BlockingCollection<T>使实现队列更容易,因为它将为您处理同步:

public class MessagePump
{
private BlockingCollection<Action> actions = new BlockingCollection<Action>();

public void Run() //you may want to restrict this so that only one caller from one thread is running messages
{
foreach (var action in actions.GetConsumingEnumerable())
action();
}

public void AddWork(Action action)
{
actions.Add(action);
}

public void Stop()
{
actions.CompleteAdding();
}
}

关于c# - 如何创建自定义消息泵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14966277/

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