Використання async-await в .net 4


137

Наразі я починаю створювати додаток, який би отримав багато прибутку від функції асинхронних очікувань C # 5. Але я не впевнений, яку версію VS та час виконання асинхронізації використовувати.

Переглядаючи діаграми популярності ОС, мені потрібно буде підтримувати Windows XP ще три роки. Схоже, що .net 4.5 працює лише в нових версіях Windows, тому мені потрібно орієнтуватися на .net 4.0. Машини розробки використовують Windows 7, тому використання нової версії VS не є проблемою.

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

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

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

І ще важливіше, який час виконання використовувати?

Чи містить VS2012 виконувану програму асинхронного перерозподілу для використання з .net 4?

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

Або я повинен використовувати реалізацію третьої сторони? Можливо, у моно є такий?

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

Мені б також хотілося, щоб мої бінарні файли працювали без змін на моно + Linux / MacOS. Таким чином, час виконання повинен бути або сумісним з тим, що вбудовано моно (2.12, мабуть), або дозволити використовувати на ОС, що не працює під керуванням Windows.


1
Я не думаю, що ви далеко не досягнете версії CTP, оскільки вам не дозволять перерозподіляти що-небудь, що є частиною CTP, комерційним додатком. Напевно ховаються помилки, які ще не оптимізовані для продуктивності. Можливо, ви будете швидше його розробляти, але ваші клієнти не будуть раді встановити бета-версію програмного забезпечення, яке може заважати остаточно випущеним версіям.
Алоїз Краус

@Alois Пізніші версії AsyncCTP дозволяють перерозподілити. І найгірше, що може статися, - це перерва в моїй заяві. Це не так, як це може заважати іншим програмам, тому я не бачу розуміння вашого концерту через втручання в остаточну версію. Також частиною мого питання є те, чи коли-небудь буде остаточна версія, яка підтримує WinXP в першу чергу.
CodesInChaos

1
У ліцензії чітко зазначено (Async CTP 3) "1.a.ii. Ви погоджуєтесь припинити таке використання негайно після повідомлення від Microsoft;". Я підозрюю, що це повідомлення надійде від MS, коли воно вийде. Я не юрист, але я впевнений, що ваш юридичний департамент (якщо він у вас є) хотів би почути ваше обгрунтування, як ви хочете обійти це питання, не порушуючи ліцензійних умов.
Алоїз Краус

Відповіді:


106

Microsoft випустила пакет орієнтації на Async (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?
понеділок


15
Майте на увазі, що для використання пакета націлювання на async в .NET 4.0 потрібно встановити KB2468871.
ghord

KB2468871 було випущено в червні 2011 року (і через 6 місяців було випущено v2), але він все ще не може бути встановлений, тому подивіться, як це перевірити в WiX - stackoverflow.com/a/9506530/968003 .
Олексій Клаус

24

Якщо ви готові розглянути інші мови .Net, F # може вирішити вашу проблему. Він мав обчислювальний вираз async {} протягом багатьох років і є сумісним назад навіть з .Net 2.0. Мінімальна вимога - Windows XP SP3. Час виконання можна завантажити тут .


4

Можна використовувати бета-версію VS 12 для націлювання на .NET 4.0 за допомогою функції async / wait.

Вам потрібно скопіювати якийсь код у проект, який надає типи, на які покладається компілятор.

Деталі тут

Редагувати: ми взяли цю техніку і перетворили її на бібліотеку з відкритим кодом під назвою 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, який є комерційним продуктом. Я припускаю, що його все ще пропонує Ксамарін .

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

EDIT: Схоже, зараз ви можете використовувати Visual Studio Async CTP у виробництві

Ось що написано на сторінці завантаження :

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


Те, що я використовую в розробці, є другорядним питанням. Основне питання - що я повинен надати своїм користувачам WinXP. Чи пропонуєте ви пакет моно 2.12 із моєю заявою?
CodesInChaos

Вчора я вивчив моно джерела, і принаймні кілька основних асинхронних класів ( Async...Builderі ...Awaiter) дуже важко відокремити від решти моно. В даний час я розглядаю можливість повторної реалізації AsyncCtpLibrary, можливо, трохи запозичивши моно.
CodesInChaos

Щодо перерозподілу AsyncCtpLibrary, я знаю, що це можливо в принципі, але для одного ліцензія містить кілька дивних застережень. Але моє головне питання тут - це те, що відбувається в довгостроковій перспективі. Якщо він стає непідтримуваним, і в ньому ніхто не виправляє помилок, це може бути прикро.
CodesInChaos

2

Якщо ви хочете розпочати розповсюдження свого програмного забезпечення після випуску MS C # 5.0, тоді ви можете почати розробку за допомогою AsycnCTP. Інакше я б не рекомендував вам використовувати його, оскільки це просто CTP, навіть не бета-версія. Його можна змінити дуже близько до бета-стадії та до випуску. Це може бути нестабільно тощо.

Якщо ви хочете ввести прості операції з асинхронізацією у вашій програмі, я б рекомендував вам використовувати реактивні розширення та речі, побудовані на вершині (Реактивний інтерфейс тощо), це просто красиво.

Що стосується VS2012, він також містить той самий Async CTP, наскільки я пам’ятаю з мого // Build / tablet MS, який мені дали на цій конференції.


1
Мене не хвилює очікування виходу VS2012. Я очікую, що VS2012 буде випущений до того, як моє програмне забезпечення вийде з альфа. Але навіть коли VS2012 виходить, я не хочу орієнтуватися на .net 4.5, оскільки це, здається, не доступне в WinXP. Таким чином, головне питання полягає в тому, який асинхронний час виконання використовувати в .net 4.
CodesInChaos
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.