我有一个任务需要在控制器处理完请求后执行,并且响应正在返回客户端的路上。为此,我已经覆盖了控制器上的OnActionExecuted()
事件并在此方法中调用了该任务。
由于任务可能需要一些时间来运行并且还返回void,我想异步调用它,以便被覆盖的OnActionExecuted()
方法可以立即返回,并且可以在执行任务时将响应发送到客户端。我尝试使用Task.Run()
(在.net 4.5中)
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
Task.Run(() => WrapUp());
}
然而,这并没有产生预期的效果。当我单步执行代码时,它仍然会同步执行 - WrapUp()
方法中的所有内容都会在OnActionExecuted()
方法退出之前调用。当WrapUp()
方法挂起时,客户端将在收到响应之前等待任务完成。
我需要做些什么才能使其按预期工作?
答案 0 :(得分:3)
OnActionExecuted
将立即返回,因为您只在内部创建并启动任务。您正在观察的行为不正常。如果您尝试以下操作会发生什么:
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
Task.Run(() => Thread.Sleep(10000));
}
客户端没有等待10秒才能得到结果,是吗?