public async Task RunCoop(CreateCoopParameters parameters) { // check possibility to run a game var possibleToRun = _IsAlreadyHasRunGame(); if (!possibleToRun || !_canRunNewGame) { _OnCreationError("You already have an active game"); } else { // set service state _canRunNewGame = false; // get game setting var settings = _GetGameSettings(parameters.Game); // create run params var runParams = new ZCoopParams { PreferredArchitecture = settings.PreferredArchitecture, Difficulty = parameters.CoopMission?.Difficulty, Level = parameters.CoopMission?.Level, Mode = parameters.Mode, FriendId = parameters.FriendId }; try { // create game to run var gameProcess = await _gameFactory.CreateCoOpAsync(runParams); // create worker var worker = _kernel.Get <CoopGameWorker>(); worker.Complete += (sender, e) => { _canRunNewGame = true; }; // pass game created event _OnCreated(worker, "Coop", parameters.Mode == ZPlayMode.CooperativeClient ? "Client" : "Host"); // run game await worker.Begin(gameProcess, settings, parameters); } catch (Exception exc) { // raise error event _OnCreationError(exc.Message); // reset service state _canRunNewGame = true; } } }