如何在C#中将多任务API响应与ID关联存储为双列结构?
解决C#异步API请求中ID与响应关联的问题
一、使用自定义ItemResponseJsonModel实现关联
你之前的问题核心是丢失了ID和响应的对应关系,同时直接将string类型的响应添加到List<ItemResponseJsonModel>中导致类型不匹配。只需修改异步任务的定义,让每个任务同时返回ID和对应的响应即可:
List<ItemResponseJsonModel> listResults = new(); var listIDs = new List<string> { "ID1", "ID2", "ID3" }; string baseURL = "https://API_URL/id="; // 修改Select逻辑,让每个任务返回包含ID和响应的ItemResponseJsonModel var postTasks = listIDs.Select(async p => new ItemResponseJsonModel { ID = p, ResponseJSON = await client.GetStringAsync(baseURL + p) }); // WhenAll后直接得到ItemResponseJsonModel数组 var posts = await Task.WhenAll(postTasks); // 直接将数组转为列表,或者逐个添加 listResults.AddRange(posts); // 验证输出 foreach (var item in listResults) { Debug.WriteLine($"ID: {item.ID}, Response: {item.ResponseJSON}"); }
关键改动说明:
- 将
Select(p => client.GetStringAsync(...))改为异步lambda表达式,先执行API请求,再返回实例化好的ItemResponseJsonModel,确保ID和响应一一绑定。 Task.WhenAll会等待所有任务完成,返回的posts直接是ItemResponseJsonModel[]类型,无需再手动关联索引,避免顺序错误。
二、是否可以用Dictionary<string, string>存储?
完全可以,如果你不需要自定义模型,只是需要快速通过ID查找响应,Dictionary<string, string>是更简洁的选择:
Dictionary<string, string> responseDict = new(); var listIDs = new List<string> { "ID1", "ID2", "ID3" }; string baseURL = "https://API_URL/id="; var postTasks = listIDs.Select(async p => { var response = await client.GetStringAsync(baseURL + p); return new KeyValuePair<string, string>(p, response); }); var keyValuePairs = await Task.WhenAll(postTasks); foreach (var kvp in keyValuePairs) { responseDict.Add(kvp.Key, kvp.Value); } // 验证输出 foreach (var kvp in responseDict) { Debug.WriteLine($"ID: {kvp.Key}, Response: {kvp.Value}"); }
两种方案对比:
- 自定义模型:适合后续需要扩展字段(比如添加请求时间、状态码等)的场景,结构更清晰,可读性更强。
- Dictionary:适合仅需ID和响应的简单映射,代码更简洁,支持通过
responseDict["ID1"]快速查询对应响应。
内容的提问来源于stack exchange,提问作者Milacay
相关产品推荐
相关产品推荐

