在后台运行异步操作方法

本文关键字:操作方法 异步 运行 后台 | 更新日期: 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信息一起工作,但有疑问您是否可以将值传递给该方法。

希望能有所帮助。