Страницы

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

суббота, 14 декабря 2019 г.

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

#c_sharp #многопоточность #async_await


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


Ответы

Ответ 1



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

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

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