Страницы

Поиск по вопросам

пятница, 19 октября 2018 г.

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

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


Ответ

Судя по метке, метод у вас асинхронный. В таком случае можно воспользоваться Task.WhenAny()
public async Task 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>() { 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); } }
Ждать или отменять оставшиеся таски, если один из них упал -- зависит от задачи. Например, если вы хотите получить цену одной и той же акции из нескольких источников, то даже если один из источников недоступен, вы дождетесь ответа другого источника. В случае если вы хотите получить цену разных акций из одного и того же источника, то, вероятно, имеет смысл отменить оставшиеся таски, поскольку понятно, что если источник недоступен, то остальные задачи тоже упадут.

Комментариев нет:

Отправить комментарий