1

我有一个任务需要在控制器处理完请求并且响应正在返回客户端的途中执行。为此,我已经覆盖了OnActionExecuted()控制器上的事件并在此方法中调用了任务。

由于任务可能需要一些时间才能运行并返回 void,所以我想异步调用它,以便覆盖的OnActionExecuted()方法可以立即返回,并且可以在任务执行时将响应发送到客户端。我试图用下面的代码来实现这个,使用Task.Run()(在.net 4.5中)

protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
    Task.Run(() => WrapUp());
}

但是,这不会产生预期的效果。当我单步执行代码时,它仍然同步执行——方法中的所有内容都在方法退出WrapUp()之前被调用。OnActionExecuted()WrapUp()方法挂起时,客户端在收到响应之前等待任务完成。

我需要做什么才能使这项工作按预期进行?

4

1 回答 1

3

OnActionExecuted立即返回,因为您在内部只是创建和启动任务。您观察到的行为不正常。如果您尝试以下操作会发生什么:

protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
    Task.Run(() => Thread.Sleep(10000));
}

客户端不会等待 10 秒才能得到结果,是吗?

于 2013-02-27T12:12:22.313 回答