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

MoX*_*lod 4 .net c# asp.net asynchronous async-await

我有以下两种方法,我用来点火并忘记调用http网址.起初,我使用ThreadPool.QueueUserWorkItem,但推荐使用异步等待,由于线程耗尽的担忧,因为这种方法可能会被频繁调用.

第一个问题是哪个更好?

第二个问题 - 异步等待实现是否正确?当我通过它进行调试时,它似乎是同步的,这是一个大问题,因为我需要它来释放调用的asp.net线程并将响应返回给用户而无需等待http调用完成.

致电 -

Send("http://example.com");
Run Code Online (Sandbox Code Playgroud)

方法-

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);
                }
            });
    }
Run Code Online (Sandbox Code Playgroud)

ASYNC/AWAIT -

致电 -

await SendAsync("http://example.com");
Run Code Online (Sandbox Code Playgroud)

方法 -

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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

Ste*_*ary 7

第一个问题是哪个更好?

都不是.我建议你至少使用类似的东西注册ASP.NET运行时的工作HostingEnvironment.QueueBackgroundWorkItem; 我在博客上描述了这个和其他方法.

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

它是异步的,但你在等待它.这告诉ASP.NET在完成该工作之前不能完成其响应.所以,它不是"火与忘记".

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

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