Я делаю все операции с моей базой данных асинхронными. Тем не менее, я не получаю желаемых результатов асинхронности.
например. -
Я вставляю 100 строк в таблицу в базе данных в цикле. Функция, которая делает это, является асинхронной функцией. Кажется, он не поддается контролю вызывающей стороне, когда его ждет. Код ниже -
[HttpGet]
[Route("/api/logtest")]
public async Task<JObject> logTestAsync()
{
JObject retval = new JObject();
DateTime dt1 = DateTime.Now;
Task t = BulkLogInsertAsync();
DateTime dt2 = DateTime.Now;
retval["Exec_Time"] = dt2.Subtract(dt1).TotalMilliseconds;
await t;
DateTime dt3 = DateTime.Now;
retval["Await_Time"] = dt3.Subtract(dt2).TotalMilliseconds;
return retval;
}
private async Task BulkLogInsertAsync()
{
List<Task<int>> allTasks = new List<Task<int>>();
for (int i = 0; i<100;i++)
{
allTasks.Add(LogInsertAsync("insert into logs values (getdate() , 'custom' , 'sample message. ', 'Log.bills', 'callsite1', '', '', '')"));
//allTasks.Add(LogInsertAsync("WAITFOR DELAY '00:00:02';"));
}
await Task.WhenAll(allTasks.ToArray()).ConfigureAwait(false);
}
private async Task<int> LogInsertAsync(string cmd)
{
int res = 0;
using (SqlConnection hookup = new SqlConnection(@"[mycnstr]"))
{
Task connectionOpeningTask = hookup.OpenAsync();
using (SqlCommand sqlcmd = new SqlCommand(cmd, hookup))
{
await connectionOpeningTask.ConfigureAwait(false);
res = await sqlcmd.ExecuteNonQueryAsync().ConfigureAwait(false);
}
hookup.Close();
}
return res;
}
Когда я вызываю API / api / logtest в первый раз, мне кажется, что я получаю желаемые результаты с exec_time, намного меньшим, чем await_time (0,2 с против 4 с)
Однако, начиная со второго запуска, я получаю await_time намного меньше, чем exec_time (4 с против 0,2 с), что заставляет меня поверить, что код работает синхронно.
Кроме того, тот же код в консольном приложении, использующем .net framework 4.6.1, непрерывно дает желаемые результаты. и нет я не перезапускаю консольное приложение. Запустил BulkLogInsertAsync в цикле do while :-)
Может кто-нибудь сказать мне, где я иду не так?