- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
public class GeoHelper
{
const string GeoIpUrl = "http://freegeoip.net/json/{0}";
private readonly string _ipAddress = string.Empty;
public GeoHelper(string ip)
{
_ipAddress = ip;
}
public async Task<string> GetGeoAsync()
{
string uri = string.Format(GeoIpUrl, _ipAddress);
var httpClient = new HttpClient();
var response = await httpClient.GetAsync(uri);
response.EnsureSuccessStatusCode();
var content = await response.Content.ReadAsStringAsync();
return content;
}
}
然后我这样调用它:
[ChildActionOnly]
public ActionResult UserGeo()
{
var ip = RequestHelper.GetClientIpAddress(Request);
var geoHelper = new GeoHelper(ip);
var response = geoHelper.GetGeoAsync();
var result = response.Result;
var resultobj = JsonConvert.DeserializeObject<GeoInfo>(result);
return Content(resultobj.city);
}
在var result = response.Result;
它等待并且永远不会结束,我在等待时头发花白。我有一个小型控制台应用程序,它在那里工作得很好。相同的代码。
最佳答案
不幸的是,MVC 目前不支持异步子操作。请对此问题投票( CodePlex 、 UserVoice )。
我解释一下死锁问题on my blog 。本质上,这是因为 ASP.NET 在请求上下文中一次只允许一个线程,当您在请求上下文中阻止一个线程(使用 Result
)时,任何 async
尝试重新进入该上下文的方法无法完成。
您可以使用各种技巧,但最干净的解决方案是如果可以的话只使用同步代码。另一种解决方案是使用 Result
,但在这种情况下,您必须确保 GetGeoAsync
中的每个 await
(以及每个 async
code> 方法调用)使用 ConfigureAwait(false)
,这意味着您不能使用 HttpContext
、请求或响应。
第三种解决方案相当hacky,是使用我的AsyncEx library中的AsyncContext.Run
:
[ChildActionOnly]
public ActionResult UserGeo()
{
return AsyncContext.Run(async () =>
{
var ip = RequestHelper.GetClientIpAddress(Request);
var geoHelper = new GeoHelper(ip);
var response = geoHelper.GetGeoAsync();
var result = await response;
var resultobj = JsonConvert.DeserializeObject<GeoInfo>(result);
return Content(resultobj.city);
}
}
但是,AsyncContext
方法并不适用于所有代码。它设置了一种“嵌套循环”,但不使用 AspNetSynchronizationContext
,因此某些 ASP.NET 代码不喜欢在 AsyncContext
中运行。
关于c# - asyncawait确实等了很多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18672612/
我在使用 aysnc 和 wait 执行 API 调用时遇到问题。我正在使用 fetch 方法调用 Spring Boot 服务,该服务在上传文件后返回 JSON 字符串。在获取上传文件数据的状态之前
我在 Typescript 中有以下内容: import sql = require("mssql"); const config: sql.config = {.... } const connec
我越来越适应 asyncawait图书馆。 如果我是对的,这是: var doSth = async function() { var asyncResult = await promiseRet
我试图在不卡住 GUI 线程的情况下执行一些耗时的操作。 UpdateSomething 方法在两个地方被调用,一次是在我的 ViewModel 的构造函数中,一次是在单击按钮 (RelayComma
我尝试过运行 npm install asyncawait --save 在我的项目中,它首先失败了,我需要安装 python ,现在它输出以下错误: D:\Projects\Lounge\Loung
我已经为较新的 Node 版本编写了代码,我希望将其实现为 Google Cloud Function (GCF)。现在的问题是GCF仅提供Node v6.14.0引擎,不支持Async功能。 我喜欢
我是一名优秀的程序员,十分优秀!