Когда использовать асинхронные операции:
- Ваше приложение должно запрашивать данные из внешних источников (внешние услуги, базы данных, ..). Используя асинхронные операции с
Task
, этот случай является ключом к масштабируемым приложениям, так как ваши потоки не блокируются в ожидании внешних источников.
- Вам необходимо выполнить множество операций, связанных с вычислением. Поскольку операции с вычислением связаны с процессором, параллелизация этих операций может значительно повысить пропускную способность приложения, особенно если ваше приложение запущено на многоядерном компьютере.
С этим, как говорится, мы не всегда используем асинхр: http://msdn.microsoft.com/en-us/magazine/hh456402.aspx
Типичный случай мы не должны запрашивать данные из внешних источников, это уже есть:
Это может на самом деле принести пользу разработчику, чтобы избежать использования асинхронных методов в определенном небольшом наборе прецедентов, особенно для библиотечных методов , доступ к которым будет осуществляться более мелкомасштабным образом. Как правило, это тот случай, когда известно, что метод может фактически выполнить синхронно, потому что данные , полагающиеся на уже имеющиеся.
асинхронные операции с Task
действительно есть накладные расходы:
При проектировании асинхронных методов, рамочные разработчики потратили много времени оптимизации прочь распределения объектов. Это связано с тем, что распределения представляют собой одну из самых больших затрат на производительность в инфраструктуре асинхронного метода . Акт выделения объекта обычно довольно дешевый. Выделение предметов сродни заполнению вашей корзине с товарами, в том, что вам не стоит много усилий по размещению предметов в вашей корзине; это когда вы на самом деле проверяете , что вам нужно вытащить свой кошелек и инвестировать значительные средства . В то время как ассигнования обычно дешевы, полученная мусорная коллекция может быть шоу-шоу, когда дело доходит до приложения..
Возможно, стоит отметить, что Task.Factory.StartNew на самом деле не является асинхронным в том смысле, который вы хотите (то есть выпустите поток); он просто работает на фоновом потоке, поэтому не дает никакой реальной выгоды, он просто увеличивает накладные расходы. Если вы все время пытались вернуть задачу, вы можете использовать Task.FromResult, который просто заставит ваш метод работать полностью синхронизироваться. И тогда вам нужно спросить себя, почему вы пытаетесь сделать его более подробным и менее понятным. – Frans