【发布时间】:2014-01-16 15:44:30
【问题描述】:
我希望在控制器方法中从不同的端点请求数据。我只想在所有这些请求完成后返回 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?
-
我对 C# 还很陌生,能否举个例子?如果可能,我希望所有请求同时完成
-
await并不强制调用线程必须阻塞。这只是强制将方法重写为延续的编译器技巧。 -
其实我和 Tejs 写的代码应该是单线程的。在这种情况下,您实际上需要一个并发/异步/单线程应用程序以获得最佳性能(I/O 绑定操作)。
-
我的意思是 Brian Reischl 实际上......不是 Tejs
标签: c# asp.net-mvc asynchronous concurrency