【发布时间】:2011-12-23 19:08:26
【问题描述】:
我正在.net 中构建一个多线程应用程序。
我有一个监听连接(抽象、串行、tcp...)的线程。
当它收到一条新消息时,它会通过 AddMessage 将它添加到。然后调用 startSpool。 startSpool 检查假脱机是否已经在运行,如果是,则返回,否则,在新线程中启动它。原因是,消息必须串行处理,先进先出。
所以,我的问题是... 我会以正确的方式解决这个问题吗? 有没有更好、更快、更便宜的模式?
如果我的代码中有错字,我很抱歉,我在复制和粘贴时遇到了问题。
ConcurrentQueue<IMyMessage > messages = new ConcurrentQueue<IMyMessage>();
const int maxSpoolInstances = 1;
object lcurrentSpoolInstances;
int currentSpoolInstances = 0;
Thread spoolThread;
public void AddMessage(IMyMessage message)
{
this.messages.Add(message);
this.startSpool();
}
private void startSpool()
{
bool run = false;
lock (lcurrentSpoolInstances)
{
if (currentSpoolInstances <= maxSpoolInstances)
{
this.currentSpoolInstances++;
run = true;
}
else
{
return;
}
}
if (run)
{
this.spoolThread = new Thread(new ThreadStart(spool));
this.spoolThread.Start();
}
}
private void spool()
{
Message.ITimingMessage message;
while (this.messages.Count > 0)
{
// TODO: Is this below line necessary or does the TryDequeue cover this?
message = null;
this.messages.TryDequeue(out message);
if (message != null)
{
// My long running thing that does something with this message.
}
}
lock (lcurrentSpoolInstances)
{
this.currentSpoolInstances--;
}
}
【问题讨论】:
-
队列将是先进先出的,但如果你有多个线程填充它,你怎么知道 IN's 的顺序是正确的?
-
@AustinSalonen 问题的描述表明有一个生产者线程添加项目(即:从 TCP 连接)和一个单独的消费者线程。这是一个经典的 FIFO 生产者/消费者场景……
-
你的
startSpool方法中有一个 ug。你永远不会增加currentSpoolInstances,所以每次调用startSpool都会启动一个新线程。你需要在释放锁之前增加currentSpoolInstances。 -
@JimMischel - 正确。我解决了这个问题。这是一个转录问题,RE:无法复制和粘贴。
标签: c# multithreading c#-4.0 concurrency