Мое требование довольно странное.Выполнять несколько экземпляров одного и того же метода асинхронно?
У меня есть SomeMethod()
, который вызывает GetDataFor()
.
public void SomeMethod()
{
for(int i = 0; i<100; i++) {
var data = GetDataFor(i);
}
}
public data GetDataFor(int i) {
//call a remote API
//to generate data for i
//store to database
return data;
}
Для каждого i
, конечный результат будет всегда быть разными. Нет необходимости подождать за GetDataFor(i)
для заполнения до звонка GetDataFor(i+1)
.
Другими словами, мне нужно:
- вызова
GetDataFor()
для каждогоi+1
сразу после успешного вызоваi
(Calling их параллельно выглядит невозможным) - ждать пока все 100 экземпляров
GetDataFor()
завершены работа - оставить в поле зрения
SomeMethod()
После YK1's answer, я попытался изменить это так:
public async Task<void> SomeMethod()
{
for(int i = 0; i < 100; i++) {
var task = Task.Run(() => GetDataFor(i));
var data = await task;
}
}
Он не бросил какие-либо ошибки, но мне нужно понять концепцию за этим:
- как будет
task
различать разные вызовы дляawait
ing? Он переписывается. - Наверно, это неправильный способ сделать это? Итак, как все правильно?
Ваш код не запускает их параллельно. Они запускаются один за другим, так как вы продолжаете ждать завершения. – poke
@poke Получил ваш момент. Я тоже не уверен. Как мы это исправим? – xameeramir
Что является основным компонентом 'GetDataFor'? Связано ли это с CPU? Диск связан? Сеть связана? В зависимости от ответа, вы, возможно, не захотите запускать их параллельно. –