Запуск нескольких асинхронных считывателей не работает асинхронно - PullRequest
0 голосов
/ 22 марта 2019

В приведенном ниже коде я пытаюсь выполнить три запроса асинхронно.Когда они запускаются, он определенно асинхронный в том смысле, что он говорит: «Запустите синхронизацию 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;
        }
    }
}
...