如何才能异步执行请求并等待一定时间后再再次发出请求,而不阻塞主线程

问题描述 投票:0回答:1

编码员们好,我有一个程序,我需要从 Excel 文件中提取 1500 个组件的列表,然后向其特定的分销商发出 api 请求。问题是每个 API 每分钟都有最大请求量,所以我需要一种方法让它等待 60 秒然后继续,而不会明显阻塞主线程。 这是我用来发出请求的代码。

if (components[0] == "Mouser" && part != components[0]) //If 1st value of components list is "Mouser"
                            //POST REQUEST TO SEARCH BY MOUSERPARTNUMBER
                            {

                                if (countMouser >= 30)
                                {

                                    Thread.Sleep(60000);
                                }
                                string search_api_key = "my_api_key_is_here";
                                {

                                    client.DefaultRequestHeaders.Accept.Clear();
                                    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                                }
                                string _partNumber = val;
                                var request = new HttpRequestMessage(HttpMethod.Post, $"https://api.mouser.com/api/v1/search/partnumber?apiKey={search_api_key}");
                                request.Content = new StringContent($@"{{
""SearchByPartRequest"": {{
    ""mouserPartNumber"": ""{_partNumber}"",
    ""partSearchOptions"": ""string"" 
    }} 
}}");
                                request.Content.Headers.ContentType.MediaType = "application/json";

                                var response = await client.SendAsync(request, CancellationToken.None);
                                result = await response.Content.ReadAsStringAsync();

考虑每个组件列表都以经销商名称开头,在本例中为“Mouser”,后面是完整的零件号列表。 每分钟的最大请求量是 30。所以在这部分中我想停止 for 循环 60 秒,但不是整个程序。我该怎么做?

if (countMouser >= 30)
{
  Thread.Sleep(60000);
} 

我考虑过使用不同的线程,但我不知道该怎么做。

c# multithreading asynchronous
1个回答
0
投票

它与

await Task.Delay(60000)
一起工作正常,但我的错误是每次达到最大请求时没有将计数器重置为0。 那么问题就结束了,谢谢大家的评论。

© www.soinside.com 2019 - 2024. All rights reserved.