繁体   English   中英

如何进行异步调用不会阻止操作返回对用户的响应

[英]How to make an async call not prevent action from returning response to user

我有以下异步代码

public async static void SendAsync(string url)
{
    try
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.KeepAlive = false;
        request.Timeout = 5000;
        var response = await request.GetResponseAsync().ConfigureAwait(false);
        response.Close();
    }
    catch (Exception ex)
    {
        SendException(ex, url);
    }
}

这是由控制器动作调用的。

public ActionResult Details(string id)
{
// DO something 

SendAsync(some-valid-url);

// Do something

return View();
}

当我调试它 - 它运行异步和命中

return View();

并且在它出现之前退出

response.Close();

但是在提琴手中,你可以看到浏览器没有发送http响应,它等待SendAsync功能完成处理,这不是我想要的。 我希望http响应立即返回给用户。

为了达到这个目的,我有什么需要改变的?

我实际上编辑了它,现在正在执行async static void,因为我不需要跟踪任务的结束,

但是你确实需要跟踪,因为MVC将在Details返回时关闭连接,你需要告诉MVC你正在等待后台操作。

public async Task<ActionResult> DetailsAsync(string id)
{
    // DO something 

    var sendTask = SendAsync(some-valid-url);

    // Do something else that does not depend on sendTask

    await sendTask;

    return View();
}

回答您的最新评论

进行等待将使其等待异步http调用完成。 我不想要的。

要获得您正在寻找的行为,您需要使用AJAX ,async / await系统不会为您提供您想要的东西。 (我从来没有真正使用AJAX完成MVC所以我没有给你一个例子如何做到这一点)

进行等待将使其等待异步http调用完成。 我不想要的。

这听起来像你想要fire and forget因为你不想等待响应。

要记住一些负面因素(例如没有错误处理,没有保证等),所以我建议在将其放入项目之前先阅读一下。

在我看来,这是用fire and forget方法的最简单方法。

ThreadPool.QueueUserWorkItem(o => SendAsync(some-valid-url));

这将从应用程序池中请求可用的线程。 然后,它将使用该线程执行该方法,而不会阻止当前正在运行的方法。

我希望这有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM