【问题标题】:How to perform postasync operation inside a loop in C#如何在 C# 中的循环内执行 postasync 操作
【发布时间】: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 实例被创建,会导致套接字耗尽

标签: c# .net-core hangfire


【解决方案1】:

HttpClient 是线程安全的,意味着可以重复使用。修改 BaseAddressDefaultRequestHeaders 会修改所有请求使用的默认值,包括当前请求。在循环内修改这些只会导致问题。

HttpClient 方法是异步的。与其阻塞每一个,不如编写一个适当的异步方法更容易、更简洁,然后,当且仅当有真正需要时,以阻塞的方式调用它。

假设基本 URL 和标头不变,代码可能会更改为:


HttpClient _httpClient;

public MyClass()
{
    _httpClient=new HttpClient();
    _httpClient.DefaultHeaders......;
}

public void Process()=>ProcessAsync().Wait();

public async Task ProcessAsync(List<Item> items)
{ 
   foreach(var item in items)
   {    
        var absoluteUrl=CalculateUrl(item);
        var res=  await _httpClient.PostAsync(absoluteUrl,item.Body);
        var result= await res.Content.ReadAsStringAsync();
        saveResultInDB(result);
   }
}

【讨论】:

  • 感谢您的详细解释。如果我需要设置基本授权和凭据也根据 url 更改,如何处理?
猜你喜欢
  • 2018-07-08
  • 2014-04-10
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 2013-06-24
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
相关资源
最近更新 更多