C# ASP.NET MVC Web应用程序 – 异步调用完成后更新视图

我有一个用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)。步骤如下:

  1. 创建任务列表(不等待它们)
  2. 启动它们并等待所有任务完成。
  3. 处理结果。

示例:

// 步骤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);    }}

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注