private async Task EvaluateGameComplete() { using (await _asyncLock.LockAsync()) { if (_clients.Values.All(c => c.ResultData != null || c.Peer == null))//All remaining clients sent their data { var ctx = new GameSessionCompleteCtx(this, _scene, _config, _clients.Select(kvp => new GameSessionResult(kvp.Key, kvp.Value.Peer, kvp.Value.ResultData)), _clients.Keys); using (var scope = _scene.DependencyResolver.CreateChild(global::Server.Plugins.API.Constants.ApiRequestTag)) { await scope.ResolveAll <IGameSessionEventHandler>().RunEventHandler(eh => eh.GameSessionCompleted(ctx), ex => { _logger.Log(LogLevel.Error, "gameSession", "An error occured while running gameSession.GameSessionCompleted event handlers", ex); foreach (var client in _clients.Values) { client.GameCompleteTcs.TrySetException(ex); } }); } foreach (var client in _clients.Values) { client.GameCompleteTcs.TrySetResult(ctx.ResultsWriter); } // FIXME: Temporary workaround to issue where disconnections cause large increases in CPU/Memory usage //await Task.WhenAll(_scene.RemotePeers.Select(user => user.Disconnect("Game complete"))); await _scene.KeepAlive(TimeSpan.Zero); } } }
private async Task EvaluateGameComplete(Stream inputStream) { await CloseGameServerProcess(); var ctx = new GameSessionCompleteCtx(this, _scene, _config, new[] { new GameSessionResult("", null, inputStream) }, _clients.Keys); using (var scope = _scene.DependencyResolver.CreateChild(global::Server.Plugins.API.Constants.ApiRequestTag)) { await scope.ResolveAll <IGameSessionEventHandler>().RunEventHandler(eh => eh.GameSessionCompleted(ctx), ex => { _logger.Log(LogLevel.Error, "gameSession", "An error occured while running gameSession.GameSessionCompleted event handlers", ex); }); } // FIXME: Temporary workaround to issue where disconnections cause large increases in CPU/Memory usage //await Task.WhenAll(_scene.RemotePeers.Select(user => user.Disconnect("Game complete"))); await _scene.KeepAlive(TimeSpan.Zero); }
private async Task EvaluateGameComplete() { using (await _lock.LockAsync()) { if (_clients.Values.All(c => c.ResultData != null || c.Peer == null))//All remaining clients sent their data { var ctx = new GameSessionCompleteCtx(_scene, _clients.Select(kvp => new GameSessionResult(kvp.Key, kvp.Value.Peer, kvp.Value.ResultData)), _clients.Keys); await _eventHandlers()?.RunEventHandler(eh => eh.GameSessionCompleted(ctx), ex => { _logger.Log(LogLevel.Error, "gameSession", "An error occured while running gameSession.GameSessionCompleted event handlers", ex); foreach (var client in _clients.Values) { client.GameCompleteTcs.TrySetException(ex); } }); foreach (var client in _clients.Values) { client.GameCompleteTcs.TrySetResult(ctx.ResultsWriter); } } } }