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

时间:2015-06-17 18:27:08

标签: c# multithreading asp.net-web-api

我有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);
    }

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

2 个答案:

答案 0 :(得分:3)

将您的任务放入数组中,然后调用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

答案 1 :(得分:-2)

我会用

  

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;

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