gpt4 book ai didi

c# - C# 中 FOR 循环中的多个依赖异步 REST API 调用(链接)

转载 作者:行者123 更新时间:2023-11-30 23:20:25 25 4
gpt4 key购买 nike

我正在研究一个解决方案,其中我有一个有效负载列表,需要发布到一个 API 端点。

有效载荷结构看起来像这样,我有数千个这样的有效载荷的 IList -

{
"Body": [{
"Payload": {
"emailaddress1": "test@email.com",
"initials": "RP",
"lastname": "Patil",
"firstname": "Patil"
},
"EntityName": "person",
"Url": "https://<someurl>/api/v1/persons",
"CollectionName": "persons",
"Method": "POST"
},
{
"Payload": {
"study_name": "Chemistry",
"teacher_name": "John Doe"
},
"EntityName": "study",
"Url": "https://<someurl>/api/v1/studies",
"CollectionName": "studies",
"Method": "POST"
}]
}

现在,需要首先创建此有效载荷中的第一个对象,即 person,当我收到该实体的 ID 时,我将该实体添加到第二个有效载荷中,即“study”,之后对象变成这样 -

{
"Payload": {
"person_id" : <newly_generated_id>
"study_name": "Chemistry",
"teacher_name": "John Doe"
},
"EntityName": "study",
"Url": "https://<someurl>/api/v1/studies",
"CollectionName": "studies",
"Method": "POST"
}

目前,我正在以旧的传统方式执行此操作,即遍历 IList 并使用 async await。等待第一个 API 调用的响应,然后调用第二个 API。然而 foreach 是单线程的,创建这么多实体需要很长时间。

 foreach(var payload in payloads)
{

var personObj = payload["Body"].Where(obj => obj["EntityName"].ToString().Equals("person")).FirstOrDefault();
var studyObj = payload["Body"].Where(obj => obj["EntityName"].ToString().Equals("study")).FirstOrDefault();
var personId = await _apiService.AddPerson(personObj);

if(personId != null){
studyObj["person_id"] = personId;
var studyId = await _apiService.AddStudy(studyObj);

//and more code.. this is just a sample code that demonstrates my implementation
}
}

这很有效,但是我会阻止所有线程,直到在我们的系统中创建了所有成千上万的人和他们的研究。可以通过在每次迭代中生成单个线程来实现吗?或类似的实现?

谁能指导我针对这种特定情况采取更好的方法?像 Parallel.ForEach 这样的东西?

最佳答案

我喜欢使用 Microsoft 的 Reactive Framework(NuGet“System.Reactive”)的想法。然后你可以这样做:

Func<JObject, string, JToken> getToken =
(p, t) => p["Body"].Where(obj => obj["EntityName"].ToString() == t).FirstOrDefault();

Func<JToken, string, JToken> setPersonId = (j, t) =>
{
j["person_id"] = t;
return j;
};

var query =
from payload in payloads.ToObservable()
let personObj = getToken(payload, "person")
let studyObj = getToken(payload, "study")
from personId in Observable.FromAsync(() => _apiService.AddPerson(personObj))
where personId != null
from studyId in Observable.FromAsync(() => _apiService.AddPerson(setPersonId(studyObj, personId)))
select new { personObj, studyObj, };

query.Subscribe();

关于c# - C# 中 FOR 循环中的多个依赖异步 REST API 调用(链接),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39760969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com