【发布时间】:2015-05-04 11:21:03
【问题描述】:
我从控制器中的异步操作调用此 getJson() 函数。 我有一个大文件列表,每个文件都需要几秒钟才能处理 ReadToEndAsync()。 即使我正在等待,ReadToEndAsync() 也会阻塞。
如何异步调用 ReadToEndAsync()?
public static async Task<T> getJson<T>(String url)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(server + url);
HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync();
String jsonString;
//get the json string from the response
using (var xx = response.GetResponseStream())
{
StreamReader reader = new StreamReader(xx, Encoding.UTF8);
jsonString = await reader.ReadToEndAsync()
}
}
控制器:
_model.list.Add(await DataRetriever.getJson<ReviewModel>(url));
_model.list.Add(await DataRetriever.getJson<ReviewModel>(url));
_model.list.Add(await DataRetriever.getJson<ReviewModel>(url));
【问题讨论】:
-
ReadToEndAsync() 正在阻塞,因为您正在等待!
-
如果我不等待它,它仍然会阻塞。我怎样才能让它异步运行?
-
在调试器中,在返回之前不会执行其他代码。
-
使用线程窗口找到正确的线程。或发布任何其他证明 ReadToEndAsync 实际上阻塞了该线程的证据。我不明白你是如何确定 ReadToEndAsync 确实是阻塞函数。
-
@RjGeraci VS 调试器是异步感知的。如果您跨过,它将在等待调用完成时暂停。所以可能 ReadToEndAsync 是异步的,但调试器对你隐藏了它。那有意义吗?你还认为通话被阻塞了吗?
标签: c# .net asp.net-mvc stream