В приведенном ниже коде я пытаюсь выполнить три запроса асинхронно.Когда они запускаются, он определенно асинхронный в том смысле, что он говорит: «Запустите синхронизацию 1, запустите синхронизацию 2, запустите синхронизацию 3», и это немедленно.Когда я запускаю его не асинхронно, я получаю 'start sync1, end sync1, ..., как и следовало ожидать.
Но, похоже, тогда он запускает ExecuteReaderAsync последовательно для каждого вызова, ожидая каждогозакончите, прежде чем запускать следующий и брать то же самое время, когда я последовательно запускаю их и жду одинаковое время между ними.
Мой сервер Sql - это Enterprise 2017 на другом сервере.
Я ценю, что асинхронностьо неблокирующих задачах, но после каждого запуска одновременно я ожидал, что каждая из трех задач завершится примерно в одно и то же время.Вместо этого, когда они начинали вместе, фактические команды выполнялись, по-видимому, синхронно, одна за другой, занимая одно и то же время.
Может кто-нибудь объяснить, как на самом деле приведенный ниже код выполняется с асинхронной точки зрения и почему это не так?делать то, что я ожидал?
Даже если я изменил оператор execute и поместил его в Task.Run (), чтобы поместить его в пул потоков, я получил точно такой же ответ.
Спасибо.
using System;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Threading.Tasks;
namespace AsyncSample
{
internal class Tester
{
internal void Run()
{
AsyncTests();
Console.ReadKey();
}
private async void AsyncTests()
{
Stopwatch sw = new Stopwatch();
sw.Start();
var overallStart = sw.ElapsedMilliseconds;
Task<bool> async1 = RunASync1();
Task<bool> async2 = RunASync2();
Task<bool> async3 = RunASync3();
await Task.WhenAll(async1, async2, async3);
var overallEnd = sw.ElapsedMilliseconds - overallStart;
Console.WriteLine($"Sync test took {Math.Round(overallEnd / 1000.0, 1)} seconds.");
}
private async Task<bool> RunASync1()
{
Console.WriteLine(" async1 start");
await RunASyncQuery("SELECT TOP 10000 * from TABLE1");
Console.WriteLine(" async1 end");
return true;
}
private async Task<bool> RunASync2()
{
Console.WriteLine(" async2 start");
await RunASyncQuery("SELECT TOP 10000 * from TABLE2");
Console.WriteLine(" async2 end");
return true;
}
private async Task<bool> RunASync3()
{
Console.WriteLine(" async3 start");
await RunASyncQuery("SELECT TOP 10000 * from TABLE3");
Console.WriteLine(" async3 end");
return true;
}
private async Task<bool> RunASyncQuery(string sql)
{
string connectionString = "Server=MyServer;Database=MyDatabase;Integrated Security=SSPI;Asynchronous Processing=true";
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand command = new SqlCommand(sql, connection);
await connection.OpenAsync();
SqlDataReader reader = await command.ExecuteReaderAsync();
}
return true;
}
}
}