Нагрузочное тестирование с помощью Task.Run () внутри al oop vs WhenAll () - PullRequest
0 голосов
/ 20 марта 2020

Я хотел сделать несколько простых нагрузочных тестов для фрагмента кода, который я написал, с несколькими потоками, одновременно попадающими на фрагмент кода.

Теперь приведенный ниже пример кода № 1 дал мне ожидаемые результаты. Но я не совсем уверен, почему образец № 2 не дал мне то же самое. Может кто-нибудь объяснить, пожалуйста?

Пример кода # 1

    private static FileCreator _fileCreater;
    public static void Main(params string[] args)
    {
        _fileCreater = new FileCreator();
        RunTasks().GetAwaiter().GetResult();
    }

    private static async Task RunTasks()
    {
        List<Task> tasks = new List<Task>();

        for (int i = 0; i < 100000; i++)
        {
            tasks.Add(Task.Run(() =>
            {
                _fileCreater.SaveMessage(new Message());
            }));
        }

        await Task.WhenAll(tasks);
    }

Первоначально у меня было следующее, и я ожидал того же результата, но я заметил, что мой процессор никогда не превышал 20% , который предположил, что это действительно не занимало несколько потоков

Пример кода # 2

    private static FileCreator _fileCreater;
    public static void Main(params string[] args)
    {
        _fileCreater =  new FileCreator();
        RunTasks().GetAwaiter().GetResult();
    }

    private static async Task RunTasks()
    {
        for (int i = 0; i < 100000; i++)
        {
            await Task.Run(() =>
            {
                _fileCreater.SaveMessage(new Message());
            });
        }
    }

1 Ответ

2 голосов
/ 20 марта 2020

Ваш второй фрагмент кода ожидает каждой задачи ... так что нет, они не будут выполняться одновременно, так как вы ждете, пока каждый из них не завершит sh перед началом следующей.

...