C# 从操作运行多个请求,并等待其中一个结束
我有WebAPI2.1服务。以下是我的行动:C# 从操作运行多个请求,并等待其中一个结束,c#,multithreading,asp.net-web-api,C#,Multithreading,Asp.net Web Api,我有WebAPI2.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 en
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);
}
实现此功能的最佳方法是什么?将任务放入阵列中,然后调用: 当它完成时,
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
var taskList=new List(){…您的任务…};
而(taskList.Count>0)
{
var idx=Task.WaitAny(taskList.ToArray());
if(taskList[idx].Result is Ok)//无论适当的检查是什么?
{
返回任务列表[idx]。结果;
}
任务列表.RemoveAt(idx);
}
//如果你到了这里,你的任务都没有返回ok
//所以你想怎么处理就怎么处理
我会使用
任务WhenAll
确保在继续之前完成所有任务
以下是一个例子:
var tasks = new Task[]
{
task1,
task2
};
await Task.WhenAll(tasks);
var task1Result = ((Task<Task1Result>)tasks[0]).Result;
var task2Result = ((Task<Task2Result>)tasks[1]).Result;
var tasks=新任务[]
{
任务1,
任务2
};
等待任务。何时(任务);
var task1Result=((任务)任务[0])。结果;
var task2Result=((任务)任务[1])。结果;
如果所有任务返回相同的结果,您不需要强制转换,但您也可以并行运行返回不同结果类型的任务,您需要对其强制转换。他希望获得第一个成功的结果,不要等待所有结果。如果第一个结果不成功怎么办?@Servy:我已经编辑了答案来处理这个问题。我会一直运行
WaitAll
(当然,先删除已经完成的任务),直到您获得一个成功返回的任务,或者直到您的任务用完。
var tasks = new Task[]
{
task1,
task2
};
await Task.WhenAll(tasks);
var task1Result = ((Task<Task1Result>)tasks[0]).Result;
var task2Result = ((Task<Task2Result>)tasks[1]).Result;