【发布时间】:2014-10-04 10:39:21
【问题描述】:
我正在编写一个动作过滤器(继承自 ActionFilterAttribute),它使用 HttpClient 在 OnResultExecuted 方法中将数据发布到外部服务器。 HttpClient 有方法PostAsync,它返回一个等待的Task<HttpResponseMessage>。
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
using (var client = new HttpClient())
{
var task = client.PostAsync(GetUri(), GetContent());
var result = task.Result; // blocking
}
}
Async action filter in MVC 4 接受的答案说在 MVC 4 中是不可能的。
这在 MVC 5 中是否仍然如此,如果是这样,在不阻塞线程的情况下调用此异步方法的最佳方法是什么?
【问题讨论】:
-
不,因为从技术上讲,它不再是覆盖(方法定义本质上会有所不同)。它只是你添加的一个新方法,框架永远不会调用它。
-
@ChrisPratt 正如我所说,测试它..我在发表之前的评论之前做过。
-
该方法仍将运行同步,除非它可以返回
Task。添加async不是魔杖。 -
哇,好吧,这里的理解有些崩溃。你用 async 装饰一个方法并且它运行的事实并不意味着它是异步运行的。我完全肯定您可以运行该代码,但它绝对不会异步运行。也许您实际上并不了解异步是什么意思?这意味着该方法将在等待操作完成时放弃其线程以供其他进程使用。然后,一旦操作完成,它就会请求线程返回并继续。同步方法一直挂在线程上。
-
你们都是对的,但由此产生的行为很可能是非常错误的。过滤器将运行,但管道将在异步过滤器完成之前继续。例如,假设您想包含外部调用的结果(或者例如检查它并返回一些其他 HTTP 响应代码):这将失败,因为当异步调用返回时结果已经在进行中(这就是异步void 确实,“一劳永逸”)
标签: c# asp.net-mvc asp.net-mvc-5 async-await