Thomas
Thomas

Reputation: 29572

Create a safe-threaded client library to connect to an external API

Sorry for the name of my post but I am going to try to explain my problem.

I am building a client library to request an external API and I try to figure out how to make the methods of my library safe-threaded.

Basically the main class of my library looks like this :

public class MyCompanyApiClient
{
    private readonly HttpClient _httpClient;

    public MyCompanyApiClient(string baseUrl)
    {
        _httpClient = new HttpClient() {BaseAddress = new Uri(baseUrl)};
        _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    }

    public async Task<MyClassB> PostData(int id, MyClassA dataToPost)
    {
        var request = new HttpRequestMessage(HttpMethod.Post, $"objects/{id}");
        request.Content = new StringContent(JsonConvert.SerializeObject(dataToPost), Encoding.UTF8,
            "application/json");

        var response = await _httpClient.SendAsync(request);
        response.EnsureSuccessStatusCode();

        var stringContent = await response.Content.ReadAsStringAsync();
        return JsonConvert.DeserializeObject<MyClassB>(stringContent);
    }

    public async Task<MyClassA > GetById(int id)
    {
         ...
    }
}

I'd like to ensure that any instance members of my client class are safe-threaded.

For the moment I plan to wrap the code inside each method into a Task.Run:

public async Task<MyClassB> PostData(int id, MyClassA dataToPost)
{
    return await Task.Run(async () =>
    {
        var request = new HttpRequestMessage(HttpMethod.Post, $"objects/{id}");
        request.Content = new StringContent(JsonConvert.SerializeObject(dataToPost), Encoding.UTF8,
            "application/json");

        var response = await _httpClient.SendAsync(request);
        var stringContent = await response.Content.ReadAsStringAsync();
        return JsonConvert.DeserializeObject<MyClassB>(stringContent);
    });
}

By the way I don't even know if it is going to ensure this method to be safe-threaded.

Any help aprreciated ^^

Upvotes: 0

Views: 60

Answers (1)

Mat&#237;as Fidemraizer
Mat&#237;as Fidemraizer

Reputation: 64943

Thread-safe doesn't mean multi-threading.

It means that some code is aware that it'll be used in multi-threaded cases, and they won't get corrupted, won't produce deadlocks and other threading-related issues.

Sometimes there's code that it's thread-safe per se, while sometimes you need to use thread-synchronization approaches like monitors, mutexes, reset events, semaphores and others, to protect critical code sections from being executed by one, two or n threads at once in order to avoid, again, deadlocks, corruptions and, basically, unexpected behaviors.

In your case, it seems like you consider thread-safe launching your PostDataas a thread in the thread pool. This is a bad choice, you don't need a new thread for this.

Upvotes: 2

Related Questions