Я ищу запрос данных с разных конечных точек, внутри метода контроллера. Я только хочу вернуть View(), когда все эти запросы будут выполнены. Можно ли это сделать, и как это можно сделать?Создать тему, которая запускает несколько других потоков
Прямо сейчас я делаю что-то близкое к этому
class GetDemData
{
int count = 0;
int requestsCompleted = 0;
List<string> addresses = new List<string>();
public void AddDataToBeCollected(string address)
{
adresses.Add(address);
}
public void CollectData()
{
foreach (string address in addresses)
{
HttpClient client = new HttpClient();
client.BaseAddress = new Uri("http://localhost:1337/");
client.GetAsync(address).ContinueWith(
getTask =>
{
if (getTask.IsCanceled)
{
error();
}
else if(getTask.IsFaulted)
{
error();
}
else
{
requestsCompleted++;
checkFinished();
}
}
);
}
}
public void checkFinished()
{
if (count == requestsCompleted)
{
// All data collected
}
}
public void error()
{
// yes error
}
}
И это мой контроллер
public ActionResult GetData()
{
var data = new GetDemData();
// fill data with addresses
data.CollectData();
return View();
}
Проблема заключается в том, так как все делается асинхронной, вид сразу вернулся. Как я могу убедиться, что представление возвращается только после сбора всех данных?
Почему вы не используете Await? – Aron
Я довольно новичок в C#, если бы вы могли привести мне пример? Я хочу, чтобы все запросы выполнялись в одно и то же время, если возможно, – user3182508
'await' не заставляет блокировать вызывающий поток. Это просто компилятор, чтобы заставить переписать метод в продолжение. – Tejs