Помогите сделать асинхронную очередь. У меня что-то не особо получается.
private objject _thisLocker = new object();
private IAsyncResult _writingAR;
readonly Queue<NetMessage> _sendQueue = new Queue<NetMessage>();
// посылаю сообщение
public void Send(NetMessage msg)
{
if (msg.sended) throw new InvalidOperationException("Message already sended!");
msg.sended = true;
// добавляю сообщение в очередь
Enqueue(msg);
}
// добавление в очередь
internal void Enqueue(NetMessage msg)
{
lock (_thisLocker) // лок, чтобы никто сюда не вошел
{
_sendQueue.Enqueue(msg);
// если не равно null, то идет отправка
if (_writingAR != null)
{
return;
}
// начинаю отправку, если в очереди есть сообщения
if (_sendQueue.Count > 0)
{
var nextMessage = _sendQueue.Dequeue();
// ?????????????????? почему в данный момент _writingAR != null ???????????????????
_writingAR = NetworkStream.BeginWrite(nextMessage.data, 0, nextMessage.Size + NetMessage.HeaderSize, OnEndWrite, nextMessage);
}
}
}
// завершение отправки
private void OnEndWrite(IAsyncResult ar)
{
NetworkStream.EndWrite(ar);
lock (_thisLocker) // лок, чтобы никто сюда не вошел
{
// если в очереди есть еще сообщения, начинаю отправку следующих сообщений, если они есть
if (_sendQueue.Count > 0)
{
var nextMessage = _sendQueue.Dequeue();
_writingAR = NetworkStream.BeginWrite(nextMessage.data, 0, nextMessage.Size + NetMessage.HeaderSize, OnEndWrite, nextMessage);
}
else
{
_writingAR = null;
}
}
}
Пробовал лочить, но не получается. Отправка сообщений происходит не по порядку, т.е. несколько отправок одновременно.