Я создаю многопоточное приложение в .net.
У меня есть поток, который прослушивает соединение (абстрактное, последовательное, tcp ...).
Когда он получает новое сообщение, он добавляет его через AddMessage. Который затем вызвать startSpool. startSpool проверяет, запущена ли катушка, и, если она есть, возвращает, в противном случае запускает ее в новом потоке. Причина этого в том, что сообщения должны обрабатываться последовательно, FIFO.
Итак, мои вопросы ...
Я иду об этом правильным путем?
Есть ли лучшие, более быстрые и дешевые модели там?
Мои извинения, если в моем коде есть опечатка, у меня были проблемы с копированием и вставкой.
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--;
}
}