Как измерить производительность ожидающих асинхронных операций?

У меня есть служба Windows, которая читает из несколькихMessageQueue экземпляров. Все эти очереди сообщений работают самостоятельноTask для чтения сообщений. Обычно после прочтения сообщения работа базы данных ввода / вывода завершается. Я нашел статьи, утверждающие, что это хорошая идея - использовать async для операций ввода-вывода, потому что это освободит потоки. Я пытаюсь смоделировать повышение производительности при использовании асинхронных операций ввода-вывода в консольном приложении.

Консольное приложение

В моей тестовой среде у меня есть 10 очередей.GetQueues() возвращает 10 разныхMessageQueue экземпляров.

static void Main(string[] args)
{
    var isAsync = Console.ReadLine() == "Y";
    foreach (var queue in queueManager.GetQueues())
    {
        var temp = queue;
        Task.Run(() => ReceiveMessagesForQueue(temp, isAsync));
    }

    while (true)
    {
        FillAllQueuesWithMessages();
        ResetAndStartStopWatch();
        while(!AllMessagesRead())
        {
            Thread.Sleep(10);
        }
        Console.WriteLine("All messages read in {0}ms", stopWatch.ElapsedMilliseconds);
    }
}

static async Task ReceiveMessagesForQueue(MessageQueue queue, bool isAsync)
{
    while (true)
    {
        var message = await Task.Factory.FromAsync<Message>(queue.BeginReceive(), queue.EndReceive);

        if (isAsync)
            await ProcessMessageAsync(message);
        else
            ProcessMessage(message);
    }
}
Асинхронная обработка сообщений

Использования ждутTask.Delay(), поэтому должен выпустить токThread

static async Task ProcessMessageAsync(Message message)
{
    await Task.Delay(1000);
    BurnCpu();
}
Синхронизация обработки сообщений

ждетTask.Delay()так что не стоит выпускать токThread

static void ProcessMessage(Message message)
{
    Task.Delay(1000).Wait();
    BurnCpu();
}

В итоге результаты равны. Я что-то здесь упускаю?

Редактировать 1

Я измеряю общее время, используяstopWatch.ElapsedMilliseconds, Заполняю все очереди используяFillAllQueuesWithMessages() с 10, 100, 10000 или более сообщениями.

Редактировать 2

ReceiveMessagesForQueue() возвращаетсяTask вместоvoid сейчас.

Редактировать 3 (исправить)

Этот тест показывает мне улучшение производительности сейчас. Я должен был сделатьBurnCpu() занять больше времени В то время какTask.Delay() ожидается,BurnCPU() можно использовать освобожденный поток для обработки.

Ответы на вопрос(2)

Ваш ответ на вопрос