从 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);
}
实现此功能的最佳方法是什么?
将任务放在数组中,然后调用 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;
如果所有任务都返回相同的结果,则无需强制转换,但您也可以并行运行返回不同结果类型的任务,您需要重新转换。