[英]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.