![](/img/trans.png)
[英]Resetting OracleDataReader reader and calling SQL inside C# foreach loop
[英]Calling API inside foreach loop in c#
我有以下 function 調用我的 API
private async void applyMe(int id, string data)
{
string url = $"https://localhost:44382/api/isc/getdata?id=" + id + "&data=" + data;
ApiHelper.InitializeClient();
string _apiResult = await APIProcessor.LoadApi(url);
}
API 助手
public static class ApiHelper
{
public static HttpClient ApiClient { get; set; }
public static void InitializeClient()
{
ApiClient = new HttpClient();
ApiClient.DefaultRequestHeaders.Accept.Clear();
ApiClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/jason"));
}
}
API處理器
public class APIProcessor
{
public static async Task<string> LoadApi(string url)
{
using (HttpResponseMessage response = await ApiHelper.ApiClient.GetAsync(url))
{
if (response.IsSuccessStatusCode)
{
string _apiResult = await response.Content.ReadAsStringAsync();
return _apiResult;
}
else
{
throw new Exception(response.ReasonPhrase);
}
}
}
}
我想在foreach
循環中調用我的 API 如下
using (myEntities _context = new myEntities ())
{
foreach (var item in _context.items.Where(s => s.id >= 1 && s.id <= 500))
{
applyMe(item.id, item.data);
}
}
由於async await
,API 尚未調用 :( 請問我該如何解決這個問題?
提前致謝
使用 Task.WhenAll()。 它返回一個等待所有其他任務完成時完成的任務。 最后你需要等待而不阻塞線程。 見微軟文檔
using (myEntities _context = new myEntities ())
{
await Task.WhenAll(_context.items
.Where(s => s.id >= 1 && s.id <= 500)
.Select(s => applyMe(item.id, item.data))
);
}
重要的! applyMe 應該返回一個 Task 並且不會保持無效。 不推薦使用 async void 模式。
您可以使用IAsyncEnumerable<MyModel>
( 文檔)
public IAsyncEnumerable<MyModel> GetItems()
{
IQueryable<T> query = this._context.items;
query = query.Where(s => s.id >= 1 && s.id <= 500);
return query.AsAsyncEnumerable();
}
並將其用於:
IAsyncEnumerable<MyModel>> items = GetItems();
await foreach (var myModel in items)
{
//Call external api
}
進行這項工作的兩個小調整:第一個任務 iso void
private async Task getData(int id, string data)
{
string url = $"https://localhost:44382/api/isc/getdata?id=" + id + "&data=" + data;
ApiHelper.InitializeClient();
string _apiResult = await APIProcessor.LoadApi(url);
}
其次,等待 getData 調用
using (myEntities _context = new myEntities ())
{
foreach (var item in _context.items.Where(s => s.id >= 1 && s.id <= 500))
{
await getData(item.id, item.data);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.