创建安全线程客户端库以连接到外部 API

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

抱歉我的 post 的名字,但我会尝试解释我的问题。

我正在构建一个客户端库来请求外部 API,我试图找出如何使我的库的方法安全线程化。

我图书馆的主要 class 基本上是这样的:

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)
    {
         ...
    }
}

我想确保我的客户端 class 的任何实例成员都是安全线程的。

目前我打算将每个方法中的代码包装成一个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);
    });
}

顺便说一句,我什至不知道它是否会确保此方法是安全线程的。

感谢任何帮助^^

线程安全并不意味着多线程

这意味着一些代码知道它会在多线程情况下使用,并且它们不会被破坏,不会产生死锁和其他与线程相关的问题。

有时有代码本身是线程安全的,而有时您需要使用线程同步方法,如监视器、互斥锁、重置事件、信号量等,以保护关键代码部分不会被一个、两个或 n 个线程同时执行,以避免死锁、损坏以及基本上意外的行为。

在您的情况下,您似乎认为 线程安全 启动您的 PostData 作为线程池中的线程。这是一个糟糕的选择,您不需要为此创建新线程。