public void Dispose() { if (!Disposed) { QueuedEvent.New(ClientEvent.Dispose); } }
protected virtual void Run() { Task.Run(async() => { try { QueuedEvent.OnNew = (e) => { OnClientEvent?.Invoke(e); }; var inFault = false; var running = true; RunOpen(); while (running) { if (await QueuedEvent.Next() is var nextEvent && nextEvent.Ok) { switch (nextEvent.Value) { case ClientEvent.Dispose: RunClose(); running = false; break; case ClientEvent.Opening: break; case ClientEvent.Opened: IsConnected = true; break; case ClientEvent.Restart: case ClientEvent.Faulted: if (!inFault) { inFault = true; Client.Abort(); RunClose(); await Task.Delay(WaitOnFault.Milliseconds); RunOpen(); inFault = false; } break; case ClientEvent.Closing: break; case ClientEvent.Closed: break; } } } } catch (Exception ex) { ex.LogException(); QueuedEvent.New(ClientEvent.Exception); } finally { RunClose(); Disposed = true; QueuedEvent.OnNew = null; } }); }
private void Client_Faulted(object sender, EventArgs e) => QueuedEvent.New(ClientEvent.Faulted);
private void Client_Closed(object sender, EventArgs e) => QueuedEvent.New(ClientEvent.Closed);
private void Client_Opened(object sender, EventArgs e) => QueuedEvent.New(ClientEvent.Opened);