Использование async-await в .net 4

137

В настоящее время я начинаю создавать приложение, которое получило бы много пользы от функции async-await в C # 5. Но я не уверен, какую версию VS и асинхронной среды выполнения использовать.

Если посмотреть на графики популярности ОС, мне нужно будет поддерживать Windows XP еще около трех лет. Похоже, что .net 4.5 работает только в более новых версиях Windows, поэтому мне нужно настроить таргетинг на .net 4.0. На машинах для разработки используется Windows 7, поэтому использование более новой версии VS не проблема.

Теперь мне нужно сначала выбрать компилятор для этого:

  • VS2010 с AsyncCTP
  • Предварительный просмотр VS2012 (и окончательный, когда он появится), установив цель на .net 4.0
  • Mono (похоже, что 2.12 имеет async-await, я предпочитаю / использую VS, а не MonoDevelop как IDE)

У какого из них меньше ошибок генерации кода? Глядя на блог Джона Скита, в VS2012 Preview никогда не используется генератор кода, чем CTP.

И что еще более важно, какую среду выполнения использовать?

Содержит ли VS2012 распространяемую асинхронную среду выполнения для использования с .net 4?

Мне удалось скомпилировать код с предварительным просмотром, обратившись к среде выполнения AsyncCTP. Но поскольку у CTP странные условия лицензирования, это не похоже на хорошее долгосрочное решение.

Или мне следует использовать стороннюю реализацию? Может, у моно есть?

Для распространения библиотеки я предпочитаю просто поместить dll в тот же каталог, что и приложение, а не какой-то установщик.

Также хотелось бы, чтобы мои двоичные файлы работали без изменений на моно + Linux / MacOS. Таким образом, среда выполнения должна быть совместима с любым встроенным моно (вероятно, 2.12) или разрешать использование в операционных системах, отличных от Windows.

Коды
источник
1
Я не думаю, что вы далеко продвинетесь с версией CTP, поскольку вам не будет разрешено распространять что-либо, являющееся частью CTP, с коммерческим приложением. Конечно, есть ошибки, и он еще не оптимизирован для производительности. Возможно, вы будете быстрее разрабатывать его, но ваши клиенты не будут рады устанавливать бета-версию программного обеспечения, которое может помешать окончательно выпущенным версиям.
Алоис Краус
@Alois Более поздние версии AsyncCTP допускают повторное распространение. И самое худшее, что может случиться, - это ломается мое приложение. Не похоже, что это может мешать другим приложениям, поэтому я не понимаю, что ваш концерт помешает вмешательству в окончательную версию. Также часть моего вопроса заключается в том, будет ли когда-либо окончательная версия, которая поддерживает WinXP в первую очередь.
CodesInChaos 06
1
В лицензии четко указано (Async CTP 3) «1.a.ii. вы соглашаетесь прекратить такое использование немедленно после получения уведомления от Microsoft;». Я подозреваю, что это уведомление придет от MS, когда оно будет выпущено. Я не юрист, но уверен, что ваш юридический отдел (если он у вас есть) хотел бы услышать ваше объяснение того, как вы хотите решить эту проблему, не нарушая условий лицензии.
Алоис Краус

Ответы:

106

Microsoft выпустила пакет Async Targeting Pack (Microsoft.Bcl.Async) через Nuget в качестве замены AsyncCTP.

Подробнее об этом можно прочитать здесь: http://blogs.msdn.com/b/bclteam/archive/2013/04/17/microsoft-bcl-async-is-now-stable.aspx .

Вы можете прочитать о предыдущей версии здесь: http://blogs.msdn.com/b/lucian/archive/2012/04/24/async-targeting-pack.aspx .

Поскольку этот пакет официально поддерживается, теперь я считаю, что лучшим вариантом для таргетинга XP + async было бы использование Visual Studio 2012 + C # 5 + Async Targeting Pack.

Если вы чувствуете необходимость нацелиться на .NET 3.5, вы все равно можете использовать (мой) AsyncBridge для .NET 3.5 .

Омер Мор
источник
Я не могу найти ссылку на лицензию для вашего AsyncBridge?
toong
1
Проверьте здесь: github.com/OmerMor/AsyncBridge/blob/master/src/AsyncBridge/…
Omer Mor
15
Имейте в виду, что для использования пакета асинхронного таргетинга в .NET 4.0 требуется установка KB2468871.
ghord
KB2468871 был выпущен в июне 2011 года (а через 6 месяцев была выпущена версия 2), но он все еще может не быть установлен, поэтому посмотрите, как проверить его в WiX - stackoverflow.com/a/9506530/968003 .
Alex Klaus
24

Если вы готовы рассмотреть другие языки .Net, F # может решить вашу проблему. В нем уже много лет используется выражение вычисления async {}, и он обратно совместим даже с .Net 2.0. Минимальное требование - Windows XP SP3. Среду выполнения можно скачать здесь .

Марк Сигрист
источник
4

Можно использовать бета-версию VS 12 для таргетинга на .NET 4.0 с помощью async / await.

Вам нужно скопировать в свой проект код, который предоставляет типы, на которые опирается компилятор.

Подробности здесь

Изменить: мы взяли эту технику и превратили ее в библиотеку с открытым исходным кодом под названием AsyncBridge: https://nuget.org/packages/AsyncBridge

Алекс Дэвис
источник
3

Если вы хотите иметь возможность распространять свое программное обеспечение, я думаю, что решение Mono - действительно ваш единственный вариант прямо сейчас. Вы также говорите, что хотите, чтобы конечный результат работал на Mono поверх Linux и OS X. Ориентация на Mono для начала кажется естественным решением.

Ваша следующая проблема - IDE. Очевидно, что MonoDevelop будет работать хорошо, но вы говорите, что предпочитаете Visual Studio.

Грег Херлман создал профиль для программирования против Mono 2.8 из Visual Studio. Если вы проследите за ним, он может указать вам правильное направление для разработки против Mono 2.11 / 2.12 в Visual Studio.

Конечно, есть также Mono Tools для Visual Studio , коммерческий продукт. Я предполагаю, что Xamarin по-прежнему предлагает его .

Вы также можете запустить необходимые сборки профиля 4.5 из Mono поверх .NET, но я этого не пробовал. Профиль 4.5 - это строгий надстройка API 4.0. Возможно, попробуй и доложи.

РЕДАКТИРОВАТЬ: Похоже, что теперь вы можете использовать Visual Studio Async CTP в производстве

Вот что написано на странице загрузки :

Включает новое лицензионное соглашение для производственного использования. Примечание. Эта лицензия не является стимулом для вас использовать CTP для вашего производственного кода. CTP остается неподдерживаемой технологической версией, позволяющей использовать на свой страх и риск. Однако мы получили много запросов от разработчиков на использование CTP для производственного кода и поэтому изменили лицензию, чтобы разрешить это.

Джастин
источник
То, что я использую в разработке, - это второстепенная проблема. Основная проблема заключается в том, что я должен передать своим пользователям WinXP. Вы предлагаете связать моно 2.12 с моим приложением?
CodesInChaos
Вчера я изучил исходники моно, и по крайней мере несколько основных классов async ( Async...Builderи ...Awaiter) очень трудно отделить от остальной части моно. В настоящее время я рассматриваю возможность повторной реализации AsyncCtpLibrary, возможно, немного позаимствовав у моно.
CodesInChaos
Что AsyncCtpLibraryкасается распространения , я знаю, что это в принципе возможно, но, с одной стороны, лицензия содержит несколько странных положений. Но моя главная проблема здесь в том, что происходит в долгосрочной перспективе. Если он станет неподдерживаемым, и никто не исправил в нем ошибки, это может раздражать.
CodesInChaos
2

Если вы хотите начать распространение своего программного обеспечения после того, как MS выпустит C # 5.0, вы можете начать разработку с использованием AsycnCTP. В противном случае я бы не рекомендовал вам его использовать, так как это всего лишь CTP, даже не бета. Его можно сильно изменить ближе к стадии бета-тестирования и к релизу. Может быть нестабильным и т. Д.

Если вы хотите внедрить простые асинхронные операции в свое приложение, я бы порекомендовал вам использовать Reactive Extensions и прочее, построенное поверх (Reactive UI и т. Д.), Это просто красиво.

Что касается VS2012, он также содержит тот же самый Async CTP, насколько я помню из моей // сборки / планшета, который MS дал мне на этой конференции.

Алексей Рага
источник
1
Меня не волнует ожидание релиза VS2012. Я ожидаю, что VS2012 будет выпущен до того, как мое программное обеспечение выйдет из альфа-версии. Но даже после выпуска VS2012 я не хочу ориентироваться на .net 4.5, поскольку он, похоже, недоступен в WinXP. Таким образом, основная проблема заключается в том, какую асинхронную среду выполнения использовать в .net 4.
CodesInChaos,