如何在 C# 中的循环内执行后异步操作

How to perform postasync operation inside a loop in C#

我在 C# .netcore 中构建了一个 hangfire 作业。此作业在 forloop 中进行 postasync 调用。第一次调用 api 后,抛出以下错误。

This instance has already started one or more requests. Properties can only be modified before sending the first request

如何有效地让post在循环中同步调用?调用需要同步。

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);
   }
  }

HttpClient thread-safe 并且 意味着 可以重复使用。修改 BaseAddressDefaultRequestHeaders 会修改所有请求使用的默认值,包括当前请求。在循环内修改这些只会导致问题。

HttpClient 方法是异步的。编写一个适当的异步方法,然后,当且仅当确实需要时,以阻塞方式调用它,而不是阻塞每个方法。

假设基数 URL 和 headers 不变,代码可以更改为:


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);
   }
}