public async Task Startup(CancellationToken cancellationToken) { using (_remoteStream = _tcpClient.GetStream()) { _clientboundPacketObserverRef = await _grainFactory.CreateObjectReference <IClientboundPacketObserver>(_outcomingPacketObserver); await _grainFactory.GetGrain <IClientboundPacketSink>(_sessionId).Subscribe(_clientboundPacketObserverRef); try { while (!cancellationToken.IsCancellationRequested && !_outcomingPacketDispatcher.Completion.IsCompleted) { await DispatchIncomingPacket(); } } catch (EndOfStreamException) { var router = _grainFactory.GetGrain <IPacketRouter>(_sessionId); await router.Close(); await _outcomingPacketDispatcher.Completion; } } }
public async Task Startup(CancellationToken cancellationToken) { using (_remoteStream = _tcpClient.GetStream()) { // subscribe observer to get packet from server _clientboundPacketObserverRef = await _grainFactory.CreateObjectReference <IClientboundPacketObserver>(_outcomingPacketObserver); await _grainFactory.GetGrain <IClientboundPacketSink>(_sessionId).Subscribe(_clientboundPacketObserverRef); try { DateTime expiredTime = DateTime.Now + TimeSpan.FromSeconds(10); while (!cancellationToken.IsCancellationRequested && !_outcomingPacketDispatcher.Completion.IsCompleted) { await DispatchIncomingPacket(); // renew subscribe, 10 sec if (DateTime.Now > expiredTime) { await _grainFactory.GetGrain <IClientboundPacketSink>(_sessionId).Subscribe(_clientboundPacketObserverRef); expiredTime = DateTime.Now + TimeSpan.FromSeconds(10); } } } catch (EndOfStreamException) { var router = _grainFactory.GetGrain <IPacketRouter>(_sessionId); await router.Close(); await _outcomingPacketDispatcher.Completion; } } }
// Also clients use this to unsubscribe themselves to no longer receive the messages. public Task UnSubscribe(IClientboundPacketObserver observer) { _subsManager.Unsubscribe(observer); return(Task.CompletedTask); }