【发布时间】:2021-09-16 15:45:58
【问题描述】:
我在 C# .netcore 中构建了一个hangfire 作业。这项工作是在 forloop 中进行 postasync 调用。在第一次调用 api 后,它会抛出错误。
此实例已启动一个或多个请求。属性只能在发送第一个请求之前修改
如何有效地在循环中同步发布调用?调用需要同步。
class myclass
{
public void process(){
_httpClient = new HttpClient();
foreach(var item in list){
_httpClient.BaseAddress = baseUri;
_httpClient.DefaultRequestHeaders.Clear();
_httpClient.DefaultRequestHeaders.ConnectionClose = true
var res= _httpClient.PostAsync(url,body);
var result= res.content.readasstringasync().Result;
saveResultInDB(result);
}
}
【问题讨论】:
-
发布实际的、完整的异常文本和实际的、正在执行的代码。发布
Exception.ToString()的完整结果,而不仅仅是消息。res.content.readasstringasync().Result;甚至不会编译,如果编译了,阻止异步操作是个坏主意。请改用await -
你是在循环中修改
BaseAddress还是DefaltRequestHeaders? -
@PanagiotisKanavos 是的,我已经修改了代码 sn-p。
-
你需要
awaitPostAsync调用(和ReadAsStringAsync也一样) -
代码无法编译,存在并发错误,但最直接的问题是修改默认地址和标题。不要那样做。这些只需要设置一次。 HttpClient 旨在被重用,因此这些属性真正是所有调用使用的默认值。 ` _httpClient = new HttpClient();` 也是一个错误,随着越来越多的 HttpClient 实例被创建,会导致套接字耗尽