2015-06-17 4 views
2

У меня есть служба api 2.1. Вот мои действия:Запустить несколько запросов от Action и подождать до конца

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

Что такое лучший способ достичь этой функциональности?

+0

[WaitAny] (https://msdn.microsoft.com/en-us/library/dd270672 (v = vs.110) .aspx) –

ответ

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 
+0

Что делать, если первый результат не увенчался успехом? – Servy

+0

@Servy: Я уже отредактировал ответ, чтобы справиться с этим. Я бы просто продолжал запускать 'WaitAll' (сначала удаление уже законченной задачи), пока вы не получите тот, который успешно возвращается или пока не закончится выполнение заданий. –

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

если все задание возвращает тот же результат, вам не нужно, чтобы бросить, но вы также можете запустить задачу, которые возвращают другой тип результата параллельно, для которого необходимо отбросить назад.

+1

Он хочет получить первый успешный результат *, не дожидаясь всех результатов. – Servy

+0

действительно, я неправильно понял и был слишком готов ответить –

Смежные вопросы