2013-05-06 2 views
2

Что является лучшим способом вернуть завершенный объект Task?Каков наилучший способ вернуть завершенную задачу?

Можно написать Task.Delay(0) или Task.FromResult<bool>(true).

Но что является самым эффективным способом?

+0

В чем причина этого? Для этого вам не нужна задача. просто вызовите метод. – I4V

+3

@ I4V это обычная практика, когда иногда операция нуждается в работе, но иногда ее нет и ее можно сделать эффективно, не требуя async –

ответ

4

Ответ от Стивена Toub (MSFT):

Если вы хотите объект новой задачи каждый раз, Task.FromResult является наиболее эффективным . Task.Delay (0) в своей текущей реализации вернет задачу кэширования , но это детализация реализации. Если вы хотите использовать кэшированную задачу , вы должны ее кешировать самостоятельно, например. private static readonly Задача s_completedTask = Task.FromResult (true); а затем используйте s_completedTask.

+0

Andrii, можете ли вы дать ссылку на цитируемое вами заявление Toub? Google не возвращает никаких результатов при поиске фраз из вашей цитаты –

+0

Я спросил его прямо и разместил ответ здесь, потому что я думаю, что это важно – Andrii

4

Task.FromResult будет самым прямым. Он также включает встроенные результаты для нескольких общих целых чисел и т. Д. Однако, если ваше значение не является «очевидным» значением (и не будет иметь встроенной обработки), но, скорее всего, будет возвращено часто в вашем сценарии - тогда вы можете создать свой собственный кешированный результат в поле (возможно, статический, если это необходимо) - но важно кэшировать Задачу, а не сам результат. - иначе просто используйте Task.FromResult каждый раз.

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