在后台运行异步操作方法

时间:2013-06-24 10:06:48

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

有没有办法在标准操作方法中调用异步操作方法而不是等待异步方法执行(保持相同的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类来执行backround工作,但是当我启动任务并且action方法返回了View时,请求被终止,我的DependencyResolver实例被删除,因此后台任务开始抛出异常。

第一个想法是执行Standard.Save(不调用后台任务)并返回可以在ajax中调用Background.Save方法的View。换句话说:将另一个请求调用异步控制器,以启动后台任务。

主要问题是如何调用异步方法保存授权信息(在cookie中)和依赖项解析器(在我的例子中:autofac)。

2 个答案:

答案 0 :(得分:0)

您可以在同步代码中运行一些异步方法:

public class StandardController : Controller
{
    public ActionResult Save()
    {
        //code...
        YourMethod();
        //code...
        return View();
    }
    public async void YourMethod()
    {
      await Task.Run(()=>{
      //your async code...
      });
    }
}

您的Method()将在完全执行Save()之前和之后进行。

答案 1 :(得分:-1)

对我来说这很有用:

    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秒后发出异步Async出现在我的调试输出中。 不确定这将如何与Cookies /身份验证信息一起使用,但有疑问您可以将值传递给方法。

希望它有所帮助。