public override async Task <RunExecReply> RunExec(RunExecRequest request, ServerCallContext context) { await _semaphoreSlim.WaitAsync(); var reply = new RunExecReply(); try { using var memoryStream = new MemoryStream(request.SimConfig.Length); request.SimConfig.WriteTo(memoryStream); memoryStream.Position = 0; var simConfig = Serializer.Deserialize <SimConfig>(memoryStream); ROpsApi.RunExec(request.PathToCode, simConfig.SimCode, simConfig.SimInput); reply.Payload = new RunExecPayload(); } catch (Exception ex) { reply.Error = PopulateError(ex); _logger.LogError(ex, nameof(RunExec)); } finally { _semaphoreSlim.Release(); } return(await Task.FromResult(reply)); }