Показать сообщение отдельно
Старый 28.02.2015, 20:21   #1
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Асинхронная очередь

Помогите сделать асинхронную очередь. У меня что-то не особо получается.

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.data0nextMessage.Size NetMessage.HeaderSizeOnEndWritenextMessage);
                }
            }
        }

        
// завершение отправки
        
private void OnEndWrite(IAsyncResult ar)
        {
            
NetworkStream.EndWrite(ar);

            
lock (_thisLocker// лок, чтобы никто сюда не вошел
            
{
                
// если в очереди есть еще сообщения, начинаю отправку следующих сообщений, если они есть
                
if (_sendQueue.Count 0)
                {
                    var 
nextMessage _sendQueue.Dequeue();
                    
_writingAR NetworkStream.BeginWrite(nextMessage.data0nextMessage.Size NetMessage.HeaderSizeOnEndWritenextMessage);
                }
                else
                {
                    
_writingAR null;
                }
            }
        } 
Пробовал лочить, но не получается. Отправка сообщений происходит не по порядку, т.е. несколько отправок одновременно.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием