Назначение нескольких задач для нескольких потоков - PullRequest
0 голосов
/ 28 января 2019

У меня есть несколько REST API вызовов, которые я хочу сделать параллельно.Например,

У меня есть вызов API REST CreateData () .Я хочу создать 1000 данных на сервере, который адаптирован для многопоточной работы в 4-5 параллельных потоках.

Я разработчик C ++ и знаю, как работает многопоточность в C ++.Я довольно наивен в C # кодировании.Я знаю об асинхронных задачах, но не имею понятия, как выполнить вышеупомянутую задачу.

var response = await Task.Run(()=>CreateData());

Сейчас я делаю это по порядку, где один за другим я создаю данные в одном потоке, как только у меня естьполученный ответ предыдущего CreateData () .Это плохо сказывается на производительности и отнимает уйму времени.

Я хочу создать, скажем, 5 потоков, которые будут выполнять вызовы REST API параллельно для всех 1000 пользователей.

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Прямо сейчас вы присваиваете response результату Task.Run, который также требует, чтобы в некоторых отношениях Task завершился.Это происходит автоматически при компиляции, потому что вы используете ключевое слово await.

Если вы предпочитаете, вы можете просто присвоить response самой запущенной Task и продолжать работу.Конечно, я бы не назвал это response больше.Допустим, вы делаете это и называете это task1.

var task1 = Task.Run(()=>CreateData());

Теперь ваш код продолжит работать, а task1 будет просто представлять запущенный Task.

Если бы у вас было 5, вы могли бы делать их все так, как вам нравится.

var task1 = Task.Run(()=>CreateData());
var task2 = Task.Run(()=>CreateData());
var task3 = Task.Run(()=>CreateData());
var task4 = Task.Run(()=>CreateData());
var task5 = Task.Run(()=>CreateData());

Теперь вы также можете ждать одновременного завершения всех этих задач с помощью * 1021.* method.

await Task.WhenAll(task1, task2, task3, task4, task5);

Итак, чтобы подвести итог.

Ключевое слово await делает некоторую магию компилятора и в основном помещает обратный вызов в это место метода (присваиваяостальная часть метода является продолжением, когда Task завершено), а ТАКЖЕ присваивает Result этой Task переменной (если Task имеет результат).Здесь есть что распаковать;Я не верю, что короткий ответ действительно оправдывает происходящее.

Без использования ключевого слова await вы просто присваиваете самой переменной Task.

0 голосов
/ 28 января 2019

Вы можете обратиться к этому https://stackoverflow.com/a/25010220/4209924

ИЛИ

Вы можете сделать что-то вроде этого.

    public async Task CreateData()
    {
        // your logic here with await
    }

    public async Task GetData()
    {
        var data1 = CreateData();
        var data2 = CreateData();
        var data3 = CreateData();
        var data4 = CreateData();
        await Task.WhenAll(new Task[] { data1, data2, data3, data4 });
    }
...