c# результат быстрейшего потока

268
09 августа 2017, 17:09

Как в переменную записать результат быстрейшего метода(два раза вызывается один метод с разными передаваемыми значениями, нужен результат быстрейшего метода)?

Answer 1

Судя по метке, метод у вас асинхронный. В таком случае можно воспользоваться Task.WhenAny():

public async Task<int> FooAsync(int x)
{
    //...
}
...
var task1 = FooAsync(1);
var task2 = FooAsync(2);
var fastestTask = await Task.WhenAny(task1, task2);
var result = fastestTask.Result;

Однако может так случиться, что какой-либо таск завершится быстрее из-за исключения. В таком случае нужно снова вызвать Task.WhenAny() для оставших тасков. В общем случае решение может выглядеть так:

var task1 = FooAsync(1);
var task2 = FooAsync(2);
var task3 = FooAsync(3);
var tasks = new List<Task<int>>() { task1, task2, task3 };
int result;
while (tasks.Count > 0)
{
    var fastestTask = await Task.WhenAny(tasks);
    if (fastestTask.IsCompleted)
    {
        result = fastestTask.Result;
        break;
    }
    else // если таск упал или был отменен
    {
        tasks.Remove(fastestTask);
    }
}

Ждать или отменять оставшиеся таски, если один из них упал -- зависит от задачи. Например, если вы хотите получить цену одной и той же акции из нескольких источников, то даже если один из источников недоступен, вы дождетесь ответа другого источника. В случае если вы хотите получить цену разных акций из одного и того же источника, то, вероятно, имеет смысл отменить оставшиеся таски, поскольку понятно, что если источник недоступен, то остальные задачи тоже упадут.

READ ALSO
Awesomium WebView.HTML остается пустым после указания Source

Awesomium WebView.HTML остается пустым после указания Source

С WebControl было то же самое, пока я не вставил его на формуЯ так понимаю, что он отключен, пока не находится на форме

349
C#: Вызов функции основного потока, изменяющей содержимое контролов из другого потока

C#: Вызов функции основного потока, изменяющей содержимое контролов из другого потока

andreycha почему то пометил предыдущую мою тему как дубликат, хотя решения в "ориджинал" теме для своей проблемы я не нашёл, вроде бы другая ситуация,...

354
Ввод чисел с клавиатуры

Ввод чисел с клавиатуры

ЗдавствуйтеПодскажите, пожалуйста, как сделать диалоговое окно куда пользователь мог бы вводить только числа с клавиатуры?

456