在后台运行异步操作方法
本文关键字:操作方法 异步 运行 后台 | 更新日期: 2023-09-27 18:19:49
有没有办法在标准操作方法中调用异步操作方法,而不等待异步方法执行(保持相同的Request对象)?
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类来做后台工作,但当我启动任务时,操作方法返回了View,请求被终止,我的DependencyResolver实例被删除,所以后台任务开始抛出异常。
第一个想法是执行Standard.Save(不调用后台任务)并返回View,其中background.Save方法可以在ajax中调用。换句话说:向异步控制器调用另一个请求,以启动后台任务。
主要问题是如何调用异步方法来保留授权信息(在cookie中)和依赖关系解析程序(在我的例子中:autofac)。
您可以在sync代码中运行一些异步方法:
public class StandardController : Controller
{
public ActionResult Save()
{
//code...
YourMethod();
//code...
return View();
}
public async void YourMethod()
{
await Task.Run(()=>{
//your async code...
});
}
}
YourMethod()将在Save()完全执行之前和之后执行。
对我来说,这很好:
public class PartnerController : Controller
{
public ActionResult Registration()
{
var model = new PartnerAdditional();
model.ValidFrom = DateTime.Today;
new Action<System.Web.HttpRequestBase>(MyAsync).BeginInvoke(this.HttpContext.Request, null, null);
return View(model);
}
private void MyAsync(System.Web.HttpRequestBase req)
{
System.Threading.Thread.Sleep(5000);
foreach (var item in req.Cookies)
{
System.Diagnostics.Debug.WriteLine(item);
}
}
}
页面被张贴回来,大约10秒后异步出现在我的调试输出中。不确定这将如何与Cookies/Authentication信息一起工作,但有疑问您是否可以将值传递给该方法。
希望能有所帮助。