Is HttpClient (C#) thread-safe in C#?

Yes, HttpClient in C# is designed to be thread-safe and can be used to make concurrent requests from multiple threads or asynchronous tasks. The official documentation from Microsoft recommends using a single instance of HttpClient for the lifetime of an application, rather than creating a new instance for each request.

This is because each HttpClient instance has its own connection pool, and creating multiple instances can lead to a number of issues, such as socket exhaustion due to an excessive number of open connections. By using a single instance, you can efficiently manage connections and reuse them for multiple requests.

Here's an example of a thread-safe way to use HttpClient:

using System;
using System.Net.Http;
using System.Threading.Tasks;

public class HttpClientExample
{
    // Single, static instance of HttpClient
    private static readonly HttpClient client = new HttpClient();

    public async Task<string> GetAsync(string uri)
    {
        // This is thread-safe and can be called from multiple threads.
        HttpResponseMessage response = await client.GetAsync(uri);
        response.EnsureSuccessStatusCode();
        string responseBody = await response.Content.ReadAsStringAsync();
        return responseBody;
    }
}

class Program
{
    static async Task Main(string[] args)
    {
        HttpClientExample httpClientExample = new HttpClientExample();

        // Example of making concurrent requests
        Task<string> task1 = httpClientExample.GetAsync("https://example.com/api/endpoint1");
        Task<string> task2 = httpClientExample.GetAsync("https://example.com/api/endpoint2");

        // Wait for all tasks to complete
        await Task.WhenAll(task1, task2);

        // Output the responses
        Console.WriteLine("Response from endpoint 1:");
        Console.WriteLine(await task1);
        Console.WriteLine("Response from endpoint 2:");
        Console.WriteLine(await task2);
    }
}

In the above example, we define a single static instance of HttpClient that is shared across the application. The GetAsync method is designed to be called concurrently and will be thread-safe, reusing connections efficiently.

It's important to note that while HttpClient is thread-safe, the HttpRequestMessage and HttpResponseMessage objects are not. You should not modify these objects from multiple threads simultaneously. Each request should have its own HttpRequestMessage, and you should not share it across simultaneous calls to HttpClient. Similarly, you should process the response (HttpResponseMessage) in a thread-safe manner to avoid any issues.

Related Questions

Get Started Now

WebScraping.AI provides rotating proxies, Chromium rendering and built-in HTML parser for web scraping
Icon