在c#中异步调用API

时间:2018-03-08 09:46:19

标签: c# .net asynchronous

我需要调用一次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; }

    }

2 个答案:

答案 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");
    }