5

有没有办法在标准操作方法中调用异步操作方法而不等待异步方法执行(保持相同的请求对象)?

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。换句话说:向异步控制器调用另一个请求,以启动后台任务。

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

4

2 回答 2

0

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

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

YourMethod() 将在 Save() 完全执行之前和之后进行。

于 2019-08-13T17:16:31.970 回答
-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 秒后异步出现在我的调试输出中。不确定这将如何与 Cookie/身份验证信息一起使用,但您可以将值传递给该方法。

希望能帮助到你。

于 2013-06-24T13:49:01.133 回答