【发布时间】:2013-06-20 19:20:45
【问题描述】:
有什么方法可以在标准操作方法中调用异步操作方法而不等待异步方法执行(保持相同的请求对象)?
public class StandardController : Controller
{
public ActionResult Save()
{
// call Background.Save, do not wait for it and go to the next line
return View();
}
}
public class BackgroundController : AsyncController
{
public void SaveAsync()
{
// background work
}
}
我尝试使用 Task 类来做后台工作,但是当我开始任务并且 action 方法返回了 View 时,Request 被杀死并且我的 DependencyResolver 实例被擦除,所以后台任务开始抛出异常。
第一个想法是执行 Standard.Save(不调用后台任务)并返回可以在 ajax 中调用 Background.Save 方法的 View。换句话说:向异步控制器调用另一个请求,以启动后台任务。
主要问题是如何调用异步方法来保存授权信息(在cookies中)和依赖解析器(在我的例子中:autofac)。
【问题讨论】:
-
为什么一开始就直接调用控制器的方法?
-
你可以直接调用它。如果必须等待,
SaveAsync()将在第一个await语句上将控制权返回给Save()。如果要使用后台线程,请使用Task.Run() -
刚刚意识到
SaveAsync不是异步的。使其异步或使用Task.Run()调用它 -
好的,Task.Run() 会启动任务,但是当行“return View();”执行后,请求将被释放,后台任务将无法访问依赖解析器和请求上下文。
-
我猜你的问题和这个相关问题stackoverflow.com/q/12319642/1236044中的问题类似
标签: c# asp.net-mvc asp.net-mvc-4 asynchronous