使用ThreadPool.QueueUserWorkItem或async等待消防并忘记?

时间:2014-06-26 18:59:43

标签: c# asp.net .net asynchronous async-await

我有以下两种方法,我用来点火并忘记调用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);
        }
    }

1 个答案:

答案 0 :(得分:7)

  

第一个问题是哪一个更好?

都不是。我建议至少使用类似HostingEnvironment.QueueBackgroundWorkItem之类的东西注册ASP.NET运行时的工作; I describe this and other approaches on my blog

  

第二个问题 - 异步等待实现是否正确?当我通过它调试时,它似乎是同步的

它是异步的,但你正在等待它。这告诉ASP.NET在完成该工作之前不能完成其响应。所以,它并没有“开始,忘记了”。

  

我需要它来释放调用的asp.net线程并将响应返回给用户而无需等待http调用完成。

正如目前所写,它正在释放线程,但延迟返回响应直到HTTP调用完成。