Выполнение одной и той же хранимой процедуры параллельно с C # с использованием задач с использованием нескольких соединений, не дающих хорошего времени отклика - PullRequest
0 голосов
/ 23 октября 2018

У меня есть хранимая процедура, которая вызывает модель прогнозирования R на основе входных параметров.Мне нужно выполнить этот SP параллельно, потому что один запрос к моей службе C # будет содержать список параметров, и для каждого, если я вызову SP, его выполнение займет много времени.

Я использую приведенный ниже код

var tasks = new List<Task>();
foreach(var req in request)
{
    tasks.Add(Task.Factory.StartNew(async() =>
              await _repository.GetVolumePrediction(
                                JsonConvert.SerializeObject(req), tenantCode),
                                TaskCreationOptions.LongRunning));
}
await Task.WhenAll(tasks.ToArray());

GetVoulumePrediction

public async Task<double> GetVolumePrediction(string jsonInput, string tenantCode)
{
    using (var connection = ConnectionFactory.GetConnection())
    {
        connection.Open();
        _logger.Debug(this, "Conn opened");
        SqlCommand command = connection.CreateCommand() as SqlCommand;
        command.CommandType = CommandType.StoredProcedure;
        command.Parameters.Add("@TenantCode", SqlDbType.NVarChar, 10)
                          .Value = tenantCode;
        command.Parameters.Add("@jsonPredictionRequest", SqlDbType.NVarChar, -1)
                          .Value = jsonInput;
        command.CommandTimeout = 0;
        command.CommandText = "PredictVolume_MulWeek_MulAccountSku_New2";
        predictedVolume = Convert.ToDouble(await command.ExecuteScalarAsync());
        _logger.Debug(this, predictedVolume.ToString());
    }
}

Если одно выполнение занимает, скажем, 2 секунды, если я запускаю 10 задач, в настоящее время требуется более 20 секунд для завершения, что не дает эффекта параллельностивыполнение.Я ожидаю получить результат за 2-4 секунды.

...