我需要调用一次API 5000次,目前它与当前逻辑一个接一个地同步发生。有没有办法异步调用它而不实际等待API响应。代码如下。
while (true)
{
using (HttpClient httpclient = new HttpClient())
{// ***Want to call the API Asynchronously***
for (int i = 0; i < 5000; i++)
{
DateTime dt = DateTime.Now;
dt = dt.AddSeconds(-dt.Second);
Log[] data1 = new Log[]
{
log =new Log(){LogID=Guid.NewGuid(),LogLevel=new LogLevel(){ },Message="Maverick_Messgaes",Source="Maverick",StackTrace="Maverick Started",
Time=dt,Traceid="1"},
};
var response4 = httpclient.PostAsJsonAsync("http://localhost:8095/api/Log/PostAsync", data1).Result;
}
}
//logstack.Clear();
Console.WriteLine(log.Message + log.Time + " ");
Thread.Sleep(120000);
Console.WriteLine(" " + " 5000 messages Sent.. Iterating Again" + "" + DateTime.Now.ToString());
}
}
catch(Exception ex)
{ throw ex; }
}
答案 0 :(得分:2)
您可以使用Parallel.For
循环替换for循环,以并行运行循环中的代码。
本指南提供了一个很好的介绍示例:https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/how-to-write-a-simple-parallel-for-loop
以最简单的形式,它看起来像:
Parallel.For(0, 5000, i =>
{
// code within existing for-loop goes here...
});
如果您担心并发任务的数量,则会有一些带有ParallelOptions
参数的重载,您可以在其中指定MaxDegreeOfParallelism
。
答案 1 :(得分:-2)
看起来你没有做任何结果,所以我假设你不需要退货。
你需要使你的方法异步并等待HttpClient同步调用,就像下面的代码一样。
static void Main(string[] args)
{
using (var client = new HttpClient())
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("Continuing iteration " + i);
PostData(client);
}
Console.ReadKey();
}
}
static async void PostData(HttpClient client)
{
await client.GetStringAsync("https://www.google.com.ph");
Console.WriteLine("Async call done");
}