Ejemplo n.º 1
0
        internal async void RegisterAckTask(AckTask ackTask)
        {
            lock (Locker)
            {
                if (AckTaskList.TryAdd(ackTask.Ack.Value, ackTask))
                {
                }
                else
                {
                    // 理论上是找不到的
                }
            }

            await ackTask.Task.Task;

            lock (Locker)
            {
                if (AckTaskList.Remove(ackTask.Ack.Value, out var removedTask))
                {
                    Debug.Assert(ReferenceEquals(removedTask, ackTask));
                }
                else
                {
                    Debug.Assert(false, "收到的一定存在");
                }
            }
        }
Ejemplo n.º 2
0
        public Ack GetAck()
        {
            lock (Locker)
            {
                CurrentAck = CurrentAck.Value + 1;
                while (AckTaskList.TryGetValue(CurrentAck.Value, out _))
                {
                    CurrentAck = CurrentAck.Value + 1;
                }
            }

            return(CurrentAck);
        }
Ejemplo n.º 3
0
        internal void OnAckReceived(object?sender, AckArgs e)
        {
            AckTask ackTask;

            lock (Locker)
            {
                if (!AckTaskList.TryGetValue(e.Ack.Value, out ackTask !))
                {
                    // 被干掉了,也许是因为等待太久
                    return;
                }
            }

            if (ackTask.PeerName.Equals(e.PeerName))
            {
                // 此时也许是等待太久
                ackTask.Task.TrySetResult(true);
            }
            else
            {
                // 不是发生给这个客户端的,只是 ack 相同,这个类被改错
            }
        }