在asp.net MVC控制器上执行Aysnchronous OnActionExecuted

时间:2013-02-27 12:06:00

标签: c# asp.net-mvc multithreading asynchronous

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

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

使用下面的代码实现此功能
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
    Task.Run(() => WrapUp());
}

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

我需要做些什么才能使其按预期工作?

1 个答案:

答案 0 :(得分:3)

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

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

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