从 Action 运行多个请求并等待一个请求结束

本文关键字:请求 结束 一个 Action 运行 等待 | 更新日期: 2023-09-27 17:57:00

我有 web api 2.1 服务。这是我的行动:

    public IHttpActionResult Get()
        {
            // Desired functionality :
            // make e.g 5 request to `CheckSomething` with different parameter asynchronously/parallel  and if any of them returns status Ok end request and return its result as result of `Get` action;
        }
    public IHttpActionResult CheckSomething(int id)
    {
        // some code
        if(!something)
           return NotFound();
        return Ok(id);
    }

实现此功能的最佳方法是什么?

从 Action 运行多个请求并等待一个请求结束

将任务放在数组中,然后调用 Task.WaitAny:

var finishedTask = Task.WaitAny(myTasks);
完成后

finishedTask将是已完成myTasks数组中任务的索引。然后,您应该能够从中获得结果。

var result = myTasks[finishedTask].Result;

实际上,既然你想等待第一个返回Ok,我会做这样的事情:

var taskList = new List<Task>() { ...your tasks ... };
while (taskList.Count > 0) 
{
    var idx = Task.WaitAny(taskList.ToArray());
    if (taskList[idx].Result is Ok)   // whatever the appropriate check is?
    {
        return taskList[idx].Result;
    }
    taskList.RemoveAt(idx);
}
// If you got here, none of your tasks returned ok
// so handle that however you want

我会使用

Task.WhenAll

l 确保所有任务在连续完成之前完成。

下面是一个示例:

var tasks = new Task[]
            {
                task1,
                task2
            };
await Task.WhenAll(tasks);
var task1Result = ((Task<Task1Result>)tasks[0]).Result;
var task2Result = ((Task<Task2Result>)tasks[1]).Result;

如果所有任务都返回相同的结果,则无需强制转换,但您也可以并行运行返回不同结果类型的任务,您需要重新转换。