Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从操作运行多个请求,并等待其中一个结束_C#_Multithreading_Asp.net Web Api - Fatal编程技术网

C# 从操作运行多个请求,并等待其中一个结束

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

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