我有一个用C#编写的ASP.NET MVC应用程序,我试图并行地异步调用多个OpenAI请求,然后等待所有结果返回。
以下是这段代码的一个片段:
foreach (ChatMessage msg in messages) { List<ChatMessage> tmpMessage = new List<ChatMessage>(); tmpMessage.Add(msg); Task<ClientResult<ChatCompletion>> chatResult = client.CompleteChatAsync(tmpMessage, chatOptions); await chatResult; if (chatResult.IsCompleted && chatResult.Result.Value != null) { output.Add(chatResult.Result.Value.Content[0].Text); } }
输出列表中的每个字符串都是来自OpenAI的JSON结构化输出。然后我会遍历每个JSON输出并根据需要进行处理。
我的问题是:这真的是异步的吗?我调用了CompleteChatAsync
,但随后我使用了await chatResult
,我不确定这是否是异步操作的正确方式?
其次 – 一旦所有结果返回并处理完毕,网页的视图部分不会更新。它只是停在那里。在.NET的ASP.NET MVC Web应用程序中,我如何刷新视图?
谢谢!
回答:
要“并行”(更准确地说是并发)运行多个任务,你可以使用Task.WhenAll(listOfTasks)
。步骤如下:
- 创建任务列表(不等待它们)
- 启动它们并等待所有任务完成。
- 处理结果。
示例:
// 步骤1var allChatResults = new List<Task<ClientResult<ChatCompletion>>>();foreach (ChatMessage msg in messages){ var chatResult = client.CompleteChatAsync(tmpMessage, chatOptions); allChatResults.Add(chatResult);}// 步骤2await Task.WhenAll(allChatResults);// 步骤3foreach (Task chatResult in allChatResults){ if (chatResult.IsCompleted && chatResult.Result.Value != null) { output.Add(chatResult.Result.Value.Content[0].Text); }}