private async void SendLoop() { SendPacket packet = null; while (Parent.State == State.Connected) { packet = null; lock (SendBuffer.SyncRoot) { if (SendBuffer.Count == 0) { IsSending = false; return; } packet = SendBuffer.PopFront(); } byte[] dataToSend = null; try { dataToSend = packet.GetDataToSend(Parent.BufferSize, Parent.LegacySupport); } catch (Exception ex) { Parent.OnErrorReceived(Parent, ex.AsEventArgs()); break; } if (dataToSend == null) { continue; } try { if (Parent.Protocol == Protocol.Tcp) { await socketStream.WriteAsync(dataToSend, 0, dataToSend.Length); packet.TotalSent += dataToSend.Length; } else // UDP { packet.TotalSent += await socket.SendToAsync(dataToSend, 0, dataToSend.Length, SocketFlags.None, packet.Destination); } } catch (Exception ex) { Parent.OnErrorReceived(Parent, ex.AsEventArgs()); break; } if (!packet.SendCompleted) { lock (SendBuffer.SyncRoot) SendBuffer.PushFront(packet); } Parent.OnSendProgress(Parent, new SendProgressEventArgs(packet, dataToSend.Length)); } lock (SendBuffer.SyncRoot) IsSending = false; }