我遇到一个问题,我循环访问了大约 31 个 Web 服务 URL。 如果我在顶部代码中放置一个
Thread.Sleep(1000)
,它将完美工作,但如果我删除它,我只能在 31 个请求中的 10 个(有时更少,有时更多)请求中获得成功。我如何让它等待?
代码
foreach(var item in ss)
{
//Call metaDataApi(url,conn,name,alias)
}
public static void metadataApi(string _url, string _connstring, string _spname, string _alias)
{
// Thread.Sleep(1000);
//Metadata creation - Table Creation
using (var httpClient = new HttpClient())
{
string url = _url;
using (HttpResponseMessage response = httpClient.GetAsync(url).GetAwaiter().GetResult())
using (HttpContent content = response.Content)
{
Console.WriteLine("CHECKING");
if (response.IsSuccessStatusCode)
{
Console.WriteLine("IS OK");
string json = content.ReadAsStringAsync().GetAwaiter().GetResult();
//Doing some stuff not relevant
}
}
}
}
您应该尽可能使用
async/await
,但您可以尝试这样的方法:
// you should share this for connection pooling
public static HttpClient = new HttpClient();
public static void Main(string[] args)
{
// build a list of tasks to wait on, then wait
var tasks = ss.Select(x => metadataApi(url, conn, name, alias)).ToArray();
Task.WaitAll(tasks);
}
public static async Task metadataApi(string _url, string _connstring, string _spname, string _alias)
{
string url = _url;
var response = await httpClient.GetAsync(url);
Console.WriteLine("CHECKING");
if (response.IsSuccessStatusCode)
{
Console.WriteLine("IS OK");
string json = await content.ReadAsStringAsync();
//Doing some stuff not relevant
}
}
需要注意的一件事是,这将尝试并行运行多个。如果您需要一个接一个地运行它们,可能需要创建另一个
async
函数来单独等待每个结果并从 Main
调用该函数。 .Result
有点反模式(使用现代 C# 语法,您可以在主函数上使用 async
),但对于您的脚本来说,它应该是“好的”,但我会尽量减少它的使用(因此我不会不要在循环内使用 .Result
。