.Net 4'te async-await kullanma


137

Şu anda C # 5'in async-await özelliğinden çok kazanç sağlayacak bir uygulama oluşturmaya başlıyorum. Ama hangi VS sürümünü ve async çalışma zamanının kullanacağından emin değilim.

İşletim sistemi popülerlik tablolarına baktığımda, Windows XP'yi üç yıl daha desteklemem gerekecek. Görünüşe göre .net 4.5 sadece Windows'un yeni sürümlerinde çalışıyor, bu yüzden .net 4.0'ı hedeflemem gerekiyor. Geliştirme makineleri Windows 7 kullanıyor, bu yüzden VS'nin daha yeni bir sürümünü kullanmak sorun değil.

Şimdi bunu yapmak için bir derleyici seçmeliyim:

  • AsyncCTP'li VS2010
  • VS2012 Önizleme (ve geldikten sonra son), hedefi .net 4.0 olarak ayarlama
  • Mono (2.12'de eşzamansız bekliyor gibi görünüyor, IDE olarak MonoDevelop yerine VS'ye alışkınım / tercih ediyorum)

Hangisinde daha az kod-gen hatası var? Baktığımızda Jon Skeet blogunda VS2012 Önizleme CTP daha asla kod jeneratör kullanıyor.

Ve daha da önemlisi hangi çalışma zamanını kullanmalı?

VS2012, .net 4 ile kullanım için yeniden dağıtılabilir bir zaman uyumsuz çalışma zamanı içeriyor mu?

AsyncCTP çalışma zamanına başvurarak kodu önizleme ile derlemeyi başardım. Ancak CTP'nin garip lisans koşulları olduğundan, bu uzun vadeli iyi bir çözüm gibi görünmüyor.

Yoksa bir üçüncü taraf uygulaması mı kullanmalıyım? Belki mono'nun bir tane var?

Kütüphaneyi dağıtmak için sadece bir çeşit yükleyici yerine uygulama ile aynı dizine dll koymayı tercih ederim.

İkili dosyalarım mono + Linux / MacOS üzerinde değişiklik yapmadan çalışırsa da sevdim. Bu nedenle çalışma zamanı, mono (2.12) yerleşik olanlarla uyumlu olmalı veya Windows olmayan işletim sistemlerinde kullanılmasına izin vermelidir.


1
Ticari bir uygulama ile CTP'nin bir parçası olan hiçbir şeyi yeniden dağıtmanıza izin verilmeyeceğinden, bir CTP sürümüyle çok uzaklaşacağınızı sanmıyorum. Kesinlikle etrafta dolaşan hatalar var ve henüz performans için optimize edilmedi. Belki onu daha hızlı geliştireceksiniz, ancak müşterileriniz nihayet piyasaya sürülen sürümlere müdahale edebilecek beta yazılımı kurmaktan memnun olmayacaklar.
Alois Kraus

@Alois AsyncCTP'nin sonraki sürümleri yeniden dağıtıma izin verir. Olabilecek en kötü şey, uygulamamın kırılması. Diğer uygulamalara müdahale edebileceği gibi değil, bu yüzden son sürümle etkileşime ilişkin konserinizi anladığımı görmüyorum. Ayrıca sorumun bir kısmı, ilk etapta WinXP'yi destekleyen son bir sürüm olup olmayacağı.
CodesInChaos

1
Lisans açıkça belirtmektedir (Async CTP 3) "1.a.ii. Microsoft'un bildirimi üzerine derhal bu tür kullanımları durdurmayı kabul edersiniz;". Bu bildirimin yayınlandığında MS'den geleceğinden şüpheleniyorum. Ben avukat değilim ama eminim hukuk departmanınız (eğer varsa), lisans koşullarını bozmadan bu sorunu nasıl çözmek istediğinizi duymak ister.
Alois Kraus

Yanıtlar:


106

Microsoft , AsyncCTP'nin yerine Nuget aracılığıyla Async Hedefleme Paketi'ni (Microsoft.Bcl.Async) yayınladı.

Bununla ilgili daha fazla bilgiyi buradan edinebilirsiniz: http://blogs.msdn.com/b/bclteam/archive/2013/04/17/microsoft-bcl-async-is-now-stable.aspx .

Önceki sürümü buradan okuyabilirsiniz: http://blogs.msdn.com/b/lucian/archive/2012/04/24/async-targeting-pack.aspx .

Bu paket resmi olarak desteklendiğinden, artık XP + zaman uyumsuzluğunu hedeflemek için en iyi seçeneğin Visual Studio 2012 + C # 5 + Zaman uyumsuz Hedefleme Paketi kullanacağına inanıyorum.

Yine de .NET 3.5'i hedeflemeniz gerektiğini düşünüyorsanız, yine de (my) AsyncBridge for .NET 3.5'i kullanabilirsiniz .


AsyncBridge lisansınız için herhangi bir referans bulamıyorum?
Mart'ta


15
.NET 4.0'da zaman uyumsuz hedefleme paketi kullanmanın KB2468871'in yüklü olmasını gerektirdiğini unutmayın.
ghord

KB2468871, Haziran 2011'de piyasaya sürüldü (ve 6 ay sonra v2 yayınlandı), ancak yine de yüklenmeyebilir, bu yüzden WiX'de nasıl kontrol edileceğini görün - stackoverflow.com/a/9506530/968003 .
Alex Klaus

24

Diğer .Net dillerini düşünmeye açıksanız, F # sorununuzu çözebilir. Yıllarca async {} hesaplama ifadesine sahiptir ve .Net 2.0 ile bile geriye dönük olarak uyumludur. Minimum gereksinim Windows XP SP3'tür. Çalışma zamanı indirilebilir burada .


4

Async / await kullanarak .NET 4.0'ı hedeflemek için VS 12 beta'yı kullanmak mümkündür.

Projenize, derleyicinin dayandığı türleri sağlayan bir kod kopyalamanız gerekir.

Ayrıntılar burada

Düzenleme: Bu tekniği aldık ve AsyncBridge adlı açık kaynaklı bir kütüphaneye dönüştürdük: https://nuget.org/packages/AsyncBridge


3

Yazılımınızı dağıtabilmek istiyorsanız, şu anda Mono çözümünün gerçekten tek seçeneğiniz olduğunu düşünüyorum. Son sonucun Linux ve OS X üzerinden Mono'da çalışmasını istediğinizi de söylüyorsunuz. Mono'nun başlamasını hedeflemek doğal çözüm gibi görünüyor.

Bir sonraki sayınız IDE. MonoDevelop açıkçası işe yarayacaktır ama Visual Studio'yu tercih ettiğinizi söylüyorsunuz.

Greg Hurlman , Visual Studio'dan Mono 2.8'e karşı kodlamak için bir profil oluşturdu . Eğer onu takip ederseniz, Visual Studio'da Mono 2.11 / 2.12'ye karşı gelişmeniz için sizi doğru yönde gösterebilir.

Tabii ki, ticari bir ürün olan Visual Studio için Mono Araçları da var . Hala Xamarin tarafından teklif edildiğini düşünüyorum .

Ayrıca, .NET'in üstünde Mono'dan gerekli 4.5 profil derlemelerini çalıştırabilirsiniz, ancak bunu denemedim. 4.5 profili, 4.0 API'nin katı bir süper kümesidir. Belki denemek ve rapor vermek.

DÜZENLEME: Görünüşe göre Visual Studio Async CTP'yi artık üretimde kullanabilirsiniz

İndirme sayfasında söyledikleri :

Üretim kullanımı için yeni bir EULA içerir. Not - Bu lisans, CTP'yi üretim kodunuz için kullanmanız için teşvik oluşturmaz. CTP, desteklenmeyen ve riski size ait bir Teknoloji Önizlemesi olarak kalır. Ancak, geliştiricilerden CTP'yi üretim kodu için kullanma istekleri aldık ve buna izin vermek için lisansı değiştirdik.


Geliştirmede kullandığım şey küçük sorundur. Asıl sorun WinXP kullanıcılarıma ne vermem gerektiğidir. Uygulamamla mono 2.12 paketini önerir misiniz?
CodesInChaos

Dün mono kaynaklara baktım ve çekirdek asenkron sınıflarının ( Async...Builderve ...Awaiter) en azından birkaçının mono'nun geri kalanından ayrılması çok zordur. Şu anda yeniden monografiden bakıyorum AsyncCtpLibrary, muhtemelen mono'dan biraz ödünç alıyorum .
CodesInChaos

Yeniden dağıtmada AsyncCtpLibrary, prensipte mümkün olduğunu biliyorum, ancak birincisi için lisans birkaç garip cümle içeriyor. Ama buradaki ana sorunum uzun vadede olan şey. Desteklenmezse ve hiç kimse hataları düzeltmediyse, bu can sıkıcı olabilir.
CodesInChaos

2

MS, C # 5.0'ı çıkardıktan sonra yazılımınızı dağıtmaya başlamak istiyorsanız, AsycnCTP'yi kullanarak geliştirmeye başlayabilirsiniz. Aksi takdirde, sadece bir CTP değil, bir beta bile olduğu için kullanmanızı önermem. Beta aşamasına ve sürümüne çok yakın değiştirilebilir. Kararsız olabilir, vb.

Uygulamanızda kolay eşzamansız işlemleri tanıtmak istiyorsanız Reaktif Uzantıları ve üstüne inşa edilenleri (Reaktif UI, vb.) Kullanmanızı öneririm, sadece güzel.

VS2012'ye gelince, // Build / tablet MS'im bana bu konferansta verdiğim kadarıyla aynı Async CTP'yi de içeriyor.


1
VS2012 sürümünün beklenmesi umurumda değil. VS2012'nin yazılımım alfadan çıkmadan yayınlanmasını bekliyorum. Ancak VS2012 piyasaya sürüldüğünde bile, .net 4.5'i hedeflemek istemiyorum, çünkü bu WinXP'de mevcut görünmüyor. Yani asıl mesele, hangi zaman uyumsuz çalışma zamanının .net 4'te kullanılacağıdır.
CodesInChaos
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.