protected override void DoWork() { while (NetworkStream != null && NetworkStream.CanWrite && _queue.TryDequeue(out byte[] data)) { try { NetworkStream?.Write(data, 0, data.Length); } catch (IOException ex) { var eventArgs = new FaultExceptionEventArgs(ex); SenderNetworkFault?.Invoke(this, eventArgs); } } }
protected override void DoWork() { if (!NetworkStream.CanRead) { return; } int length = 0; try { Array.Clear(_data, 0, _data.Length); // Receive header first - 4 bytes indicating total packet length length = ReceiveHeader(); // Receive actual packet ReceivePayload(length); // Invoke event var eventArgs = new PacketReceivedEventArgs(_data, length); PacketReceived?.Invoke(this, eventArgs); } catch (ArgumentOutOfRangeException) { Logger.LogWarning("Received message, length bytes error (invalid protocol), len: " + length); } catch (IOException ex) when(ex.InnerException is SocketException innerEx && innerEx.SocketErrorCode == SocketError.TimedOut) { // Receive timeout // Swallow } catch (IOException ex) { // Critical fault - probably need to restart connection var eventArgs = new FaultExceptionEventArgs(ex); ReceiverNetworkFault?.Invoke(this, eventArgs); } }
protected virtual void InvokeNetworkFaultedEvent(object sender, FaultExceptionEventArgs args) => NetworkWorkerFaulted?.Invoke(sender, args);
private void _senderWorker_SenderNetworkFault(object sender, FaultExceptionEventArgs args) => InvokeNetworkFaultedEvent(sender, args);