创建安全线程客户端库以连接到外部 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
作为线程池中的线程。这是一个糟糕的选择,您不需要为此创建新线程。
抱歉我的 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
作为线程池中的线程。这是一个糟糕的选择,您不需要为此创建新线程。