Menggunakan async-await di .net 4

137

Saat ini saya mulai membuat aplikasi yang akan mendapat banyak keuntungan dari fitur async-await C # 5. Tapi saya tidak yakin versi VS dan runtime asinkron mana yang akan digunakan.

Melihat grafik popularitas OS, saya perlu mendukung Windows XP selama tiga tahun atau lebih. Sepertinya .net 4.5 hanya berjalan pada versi Windows yang lebih baru, jadi saya perlu menargetkan .net 4.0. Mesin pengembangan menggunakan Windows 7, jadi menggunakan versi VS yang lebih baru tidak menjadi masalah.

Sekarang saya harus memilih kompiler untuk melakukan ini:

  • VS2010 dengan AsyncCTP
  • VS2012 Preview (dan final setelah itu tiba), menetapkan target ke .net 4.0
  • Mono (Sepertinya 2.12 memiliki async-await, saya lebih suka / saya terbiasa VS daripada MonoDevelop sebagai IDE)

Manakah yang memiliki lebih sedikit bug code-gen? Melihat blog Jon Skeet, VS2012 Preview tidak pernah menggunakan generator kode selain CTP.

Dan yang lebih penting runtime mana yang akan digunakan?

Apakah VS2012 berisi runtime asinkron yang dapat didistribusikan ulang untuk digunakan dengan .net 4?

Saya berhasil mengkompilasi kode, dengan pratinjau, dengan merujuk runtime AsyncCTP. Tetapi karena CTP memiliki persyaratan perizinan yang aneh, itu sepertinya bukan solusi jangka panjang yang baik.

Atau haruskah saya menggunakan implementasi pihak ketiga? Mungkin mono punya satu?

Untuk mendistribusikan pustaka, saya lebih suka meletakkan dll di direktori yang sama dengan aplikasi, daripada semacam penginstal.

Saya juga suka jika binari saya berfungsi tanpa perubahan pada mono + Linux / MacOS. Jadi runtime harus kompatibel dengan mono apa pun (mungkin 2.12) yang telah terpasang, atau mengizinkan penggunaan pada OS non-windows.

CodesInChaos
sumber
1
Menurut saya, Anda tidak akan mendapatkan banyak manfaat dengan versi CTP karena Anda tidak akan diizinkan untuk mendistribusikan kembali apa pun yang merupakan bagian dari CTP dengan aplikasi komersial. Pasti ada bug yang bersembunyi di sekitar dan itu belum dioptimalkan untuk kinerja. Anda mungkin akan lebih cepat mengembangkannya tetapi pelanggan Anda tidak akan senang menginstal perangkat lunak beta yang dapat mengganggu versi yang akhirnya dirilis.
Alois Kraus
@Alois Versi AsyncCTP memungkinkan redistribusi. Dan hal terburuk yang bisa terjadi adalah aplikasi saya rusak. Ini tidak seperti itu dapat mengganggu aplikasi lain, jadi saya tidak mengerti konser Anda karena gangguan pada versi final. Juga bagian dari pertanyaan saya adalah apakah akan ada versi final yang mendukung WinXP di tempat pertama.
CodesInChaos
1
Lisensi dengan jelas menyatakan (Async CTP 3) "1.a.ii. Anda setuju untuk segera menghentikan penggunaan tersebut setelah pemberitahuan dari Microsoft;". Saya menduga pemberitahuan ini akan datang dari MS saat dirilis. Saya bukan pengacara, tetapi saya yakin departemen hukum Anda (jika ada) akan senang mendengar alasan Anda bagaimana Anda ingin mengatasi masalah ini tanpa melanggar persyaratan lisensi.
Alois Kraus

Jawaban:

106

Microsoft merilis Async Targeting Pack (Microsoft.Bcl.Async) melalui Nuget sebagai pengganti AsyncCTP.

Anda dapat membaca lebih lanjut di sini: http://blogs.msdn.com/b/bclteam/archive/2013/04/17/microsoft-bcl-async-is-now-stable.aspx .

Anda dapat membaca tentang versi sebelumnya di sini: http://blogs.msdn.com/b/lucian/archive/2012/04/24/async-targeting-pack.aspx .

Karena paket ini secara resmi didukung, saya sekarang yakin opsi terbaik untuk menargetkan XP + async adalah menggunakan Visual Studio 2012 + C # 5 + Async Targeting Pack.

Jika Anda merasa perlu menargetkan .NET 3.5, Anda masih dapat menggunakan AsyncBridge (saya) untuk .NET 3.5 .

Omer Mor
sumber
Saya tidak dapat menemukan referensi apa pun ke lisensi untuk AsyncBridge Anda?
toong
15
Ingatlah bahwa menggunakan paket penargetan asinkron di .NET 4.0 memerlukan penginstalan KB2468871.
ghord
KB2468871 dirilis pada Juni 2011 (dan 6 bulan kemudian v2 dirilis), tetapi mungkin masih belum diinstal, jadi lihat cara memeriksanya di WiX - stackoverflow.com/a/9506530/968003 .
Alex Klaus
24

Jika Anda terbuka untuk mempertimbangkan bahasa .Net lainnya, F # dapat menyelesaikan masalah Anda. Itu telah memiliki ekspresi komputasi {} asinkron selama bertahun-tahun, dan kompatibel ke belakang bahkan dengan .Net 2.0. Persyaratan minimum adalah Windows XP SP3. Runtime dapat diunduh di sini .

Marc Sigrist
sumber
4

VS 12 beta dapat digunakan untuk menargetkan .NET 4.0 menggunakan async / await.

Anda perlu menyalin beberapa kode ke dalam proyek Anda yang menyediakan tipe yang diandalkan oleh compiler.

Detailnya di sini

Sunting: kami telah mengambil teknik ini dan mengubahnya menjadi perpustakaan sumber terbuka yang disebut AsyncBridge: https://nuget.org/packages/AsyncBridge

Alex Davies
sumber
3

Jika Anda ingin dapat mendistribusikan perangkat lunak Anda, saya pikir solusi Mono benar-benar satu-satunya pilihan Anda saat ini. Anda juga mengatakan bahwa Anda ingin hasil akhirnya berjalan di Mono melalui Linux dan OS X. Menargetkan Mono untuk memulai sepertinya merupakan solusi alami.

Masalah Anda berikutnya adalah IDE. MonoDevelop jelas akan bekerja dengan baik tetapi Anda mengatakan Anda lebih suka Visual Studio.

Greg Hurlman membuat profil untuk mengkodekan Mono 2.8 dari Visual Studio. Jika Anda menindaklanjutinya, dia mungkin dapat mengarahkan Anda ke arah yang benar untuk mengembangkan terhadap Mono 2.11 / 2.12 di Visual Studio.

Tentunya ada juga Mono Tools for Visual Studio yang merupakan produk komersil. Saya berasumsi bahwa itu masih ditawarkan oleh Xamarin .

Anda mungkin juga dapat menjalankan rakitan profil 4,5 yang diperlukan dari Mono di atas .NET tetapi saya belum mencobanya. Profil 4.5 adalah kumpulan super ketat dari API 4.0. Mungkin mencobanya dan laporkan kembali.

EDIT: Sepertinya Anda dapat menggunakan Visual Studio Async CTP dalam produksi sekarang

Inilah yang tertulis di halaman unduhan :

Termasuk EULA baru untuk penggunaan produksi. Catatan - Lisensi ini bukan merupakan dorongan bagi Anda untuk menggunakan CTP untuk kode produksi Anda. CTP tetap merupakan Pratinjau Teknologi yang tidak didukung dan digunakan dengan risiko Anda sendiri. Namun, kami telah menerima banyak permintaan dari pengembang untuk menggunakan CTP untuk kode produksi, dan telah mengubah lisensinya untuk mengizinkannya.

Justin
sumber
Apa yang saya gunakan dalam pengembangan adalah masalah kecil. Masalah utama adalah apa yang harus saya berikan kepada pengguna WinXP saya. Apakah Anda menyarankan bundel mono 2.12 dengan aplikasi saya?
CodesInChaos
Kemarin saya melihat ke sumber mono, dan setidaknya beberapa kelas asinkron inti ( Async...Builderdan ...Awaiter) sangat sulit dipisahkan dari mono lainnya. Saat ini saya sedang mencari implementasi ulang AsyncCtpLibrary, mungkin meminjam sedikit dari mono.
CodesInChaos
Tentang pendistribusian ulang AsyncCtpLibrary, saya tahu bahwa hal itu pada prinsipnya mungkin, tetapi untuk satu lisensi berisi beberapa klausul yang aneh. Tapi masalah utama saya di sini adalah apa yang terjadi dalam jangka panjang. Jika itu menjadi tidak didukung, dan tidak ada yang memperbaiki bug di dalamnya, itu mungkin mengganggu.
CodesInChaos
2

Jika Anda ingin mulai mendistribusikan perangkat lunak Anda setelah MS merilis C # 5.0, maka Anda dapat mulai mengembangkan menggunakan AsycnCTP. Kalau tidak, saya tidak akan merekomendasikan Anda untuk menggunakannya, karena ini hanya CTP, bahkan bukan beta. Itu dapat banyak diubah dekat dengan tahap beta dan rilis. Mungkin tidak stabil, dll.

Jika Anda ingin memperkenalkan operasi asinkron yang mudah dalam aplikasi Anda, saya akan merekomendasikan Anda untuk menggunakan Ekstensi Reaktif dan hal-hal yang dibangun di atas (UI Reaktif, dll), itu hanya cantik.

Sedangkan untuk VS2012, ini juga berisi Async CTP yang sama sejauh yang saya ingat dari // Build / tablet yang diberikan MS saya pada konferensi itu.

Alexey Raga
sumber
1
Saya tidak peduli menunggu rilis VS2012. Saya berharap VS2012 akan dirilis sebelum perangkat lunak saya keluar dari alpha. Tetapi bahkan setelah VS2012 dirilis, saya tidak ingin menargetkan .net 4.5, karena tampaknya itu tidak tersedia di WinXP. Jadi masalah utamanya adalah runtime asinkron mana yang akan digunakan pada .net 4.
CodesInChaos