我有以下两种方法,我用来点火并忘记调用http网址。 最初我使用的是ThreadPool.QueueUserWorkItem,但由于担心线程耗尽,建议使用Async Await,因为这种方法可能会被频繁调用。
第一个问题是哪一个更好?
第二个问题 - 异步等待实现是否正确?当我通过它进行调试时,它似乎是同步的,这是一个大问题,因为我需要它来释放调用的asp.net线程并将响应返回给用户而无需等待http调用完成。
致电 -
Send("http://example.com");
的方法 -
public static void Send(string url)
{
ThreadPool.QueueUserWorkItem(
o =>
{
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.KeepAlive = false;
request.Timeout = 5000;
var response = request.GetResponse();
response.Close();
}
catch (Exception ex)
{
SendException(ex, url);
}
});
}
ASYNC / AWAIT -
致电 -
await SendAsync("http://example.com");
方法 -
public async static Task 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);
}
}
答案 0 :(得分:7)
第一个问题是哪一个更好?
都不是。我建议至少使用类似HostingEnvironment.QueueBackgroundWorkItem
之类的东西注册ASP.NET运行时的工作; I describe this and other approaches on my blog
第二个问题 - 异步等待实现是否正确?当我通过它调试时,它似乎是同步的
它是异步的,但你正在等待它。这告诉ASP.NET在完成该工作之前不能完成其响应。所以,它并没有“开始,忘记了”。
我需要它来释放调用的asp.net线程并将响应返回给用户而无需等待http调用完成。
正如目前所写,它正在释放线程,但延迟返回响应直到HTTP调用完成。