ใช้ async-await บน. net 4


137

ขณะนี้ฉันเริ่มสร้างแอปพลิเคชันที่จะได้รับประโยชน์มากมายจากคุณลักษณะ async ที่รอคอยของ C # 5 แต่ฉันไม่แน่ใจว่าเวอร์ชัน VS และรันไทม์ async ที่จะใช้

เมื่อดูที่ชาร์ตยอดนิยมของ OS ฉันจะต้องรองรับ 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)

อันไหนที่มีบั๊กของโค้ด - เจนน้อยลง? การดูบล็อกของ Jon Skeet VS2012 Preview ใช้ตัวสร้างโค้ดที่ไม่ได้ใช้งานมากกว่า CTP

และที่สำคัญกว่านั้นใช้ runtime แบบใด

VS2012 มีรันไทม์ async แบบแจกจ่ายต่อได้สำหรับใช้กับ. net 4 หรือไม่

ฉันจัดการเพื่อคอมไพล์โค้ดด้วยการแสดงตัวอย่างโดยอ้างอิงรันไทม์ AsyncCTP แต่เนื่องจาก CTP มีเงื่อนไขการออกใบอนุญาตแปลก ๆ นั่นจึงไม่ใช่วิธีแก้ปัญหาระยะยาวที่ดี

หรือฉันควรใช้การใช้งานของบุคคลที่สาม? บางทีอาจมีขาวดำ?

สำหรับการกระจายไลบรารี่ฉันต้องการเพียงวาง dll ในไดเรกทอรีเดียวกับแอปพลิเคชันแทนที่จะติดตั้งบางชนิด

ฉันยังต้องการถ้าไบนารีของฉันจะทำงานโดยไม่มีการเปลี่ยนแปลงในโมโน + Linux / MacOS ดังนั้นรันไทม์ควรจะเข้ากันได้กับสิ่งที่โมโน (2.12 อาจ) ได้สร้างขึ้นในหรืออนุญาตให้ใช้บนระบบปฏิบัติการที่ไม่ใช่ windows


1
ฉันไม่คิดว่าคุณจะเข้าใกล้รุ่น CTP มากนักเนื่องจากคุณจะไม่ได้รับอนุญาตให้เผยแพร่สิ่งที่เป็นส่วนหนึ่งของ CTP กับแอปพลิเคชันเชิงพาณิชย์ มีข้อบกพร่องแน่นอนที่ซุ่มซ่อนอยู่รอบ ๆ และมันยังไม่ได้รับการปรับแต่งเพื่อประสิทธิภาพ คุณอาจจะพัฒนาได้เร็วขึ้น แต่ลูกค้าของคุณจะไม่ยินดีที่จะติดตั้งซอฟต์แวร์เบต้าซึ่งอาจรบกวนการทำงานของรุ่นที่วางจำหน่ายในที่สุด
— Alois Kraus

@Alois AsyncCTP รุ่นที่ใหม่กว่าอนุญาตการแจกจ่ายซ้ำ และสิ่งที่แย่ที่สุดที่สามารถเกิดขึ้นได้คือใบสมัครของฉันหยุด ไม่ใช่ว่ามันจะรบกวนการทำงานของแอพพลิเคชั่นอื่น ๆ ดังนั้นฉันไม่เห็นความเข้าใจของคุณเกี่ยวกับการแทรกแซงของเวอร์ชั่นสุดท้าย อีกส่วนหนึ่งของคำถามของฉันคือถ้ามีรุ่นสุดท้ายที่รองรับ WinXP ในตอนแรก
— CodesInChaos

1
ใบอนุญาตระบุอย่างชัดเจน (Async CTP 3) "1.a.ii. คุณตกลงที่จะยุติการใช้ดังกล่าวทันทีที่มีการแจ้งจาก Microsoft;" ฉันสงสัยว่าประกาศนี้จะมาจาก MS เมื่อมีการเผยแพร่ ฉันไม่ใช่ทนายความ แต่ฉันมั่นใจว่าแผนกกฎหมายของคุณ (ถ้าคุณมี) จะชอบที่จะได้ยินเหตุผลของคุณว่าคุณต้องการที่จะได้รับสิ่งนี้โดยไม่ละเมิดข้อกำหนดใบอนุญาต
— Alois Kraus

คำตอบ:


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

หากคุณรู้สึกว่าจำเป็นต้องกำหนดเป้าหมาย. NET 3.5 คุณยังสามารถใช้ (my) AsyncBridge สำหรับ. NET 3.5ได้


ฉันไม่พบการอ้างอิงถึงใบอนุญาตสำหรับ AsyncBridge ของคุณ?
— toong


15
โปรดทราบว่าการใช้ชุดการกำหนดเป้าหมายแบบ async บน. NET 4.0 จะต้องติดตั้ง KB2468871
— ghord

KB2468871 ได้รับการปล่อยตัวในมิถุนายน 2011 (6 เดือนต่อมาได้รับการปล่อยตัว v2) แต่มันอาจจะยังไม่ได้รับการติดตั้งเพื่อดูวิธีการตรวจสอบใน WiX - stackoverflow.com/a/9506530/968003
— Alex Klaus

24

หากคุณเปิดรับการพิจารณาภาษา. Net อื่น ๆ F # สามารถแก้ปัญหาของคุณได้ มันมีการแสดงออกการคำนวณ async {} มานานหลายปีและสามารถใช้งานร่วมกับ. NET 2.0 ได้ ความต้องการขั้นต่ำคือ Windows XP SP3 รันไทม์ที่สามารถดาวน์โหลดได้ที่นี่


4

เป็นไปได้ที่จะใช้ VS 12 beta เพื่อกำหนดเป้าหมาย. NET 4.0 โดยใช้ async / await

คุณต้องคัดลอกโค้ดบางส่วนไปยังโปรเจ็กต์ของคุณที่ให้ประเภทที่คอมไพเลอร์อาศัย

รายละเอียดที่นี่

แก้ไข: เราใช้เทคนิคนี้และเปลี่ยนเป็นไลบรารีโอเพ่นซอร์สชื่อ AsyncBridge: https://nuget.org/packages/AsyncBridge


3

หากคุณต้องการเผยแพร่ซอฟต์แวร์ของคุณฉันคิดว่าโซลูชัน Mono เป็นตัวเลือกเดียวของคุณในขณะนี้ คุณบอกว่าคุณต้องการให้ผลลัพธ์สุดท้ายทำงานบน Mono ผ่าน Linux และ OS X การกำหนดเป้าหมาย Mono ให้เริ่มต้นด้วยดูเหมือนว่าเป็นวิธีแก้ปัญหาตามธรรมชาติ

ปัญหาต่อไปของคุณคือ IDE MonoDevelop จะทำงานได้ดีอย่างเห็นได้ชัด แต่คุณบอกว่าคุณชอบ Visual Studio

Greg Hurlman สร้างโปรไฟล์เพื่อโค้ดต่อต้าน Mono 2.8 จาก Visual Studio หากคุณติดต่อกับเขาเขาอาจจะชี้คุณไปในทิศทางที่ถูกต้องสำหรับการพัฒนากับโมโน 2.11 / 2.12 ใน Visual Studio

แน่นอนว่ายังมีMono Tools สำหรับ Visual Studioซึ่งเป็นผลิตภัณฑ์เชิงพาณิชย์ ฉันคิดว่ามันยังถูกเสนอโดยXamarin Xamarin

คุณอาจสามารถเรียกใช้แอสเซมบลีโปรไฟล์ 4.5 ที่จำเป็นจาก Mono ที่ด้านบนของ. NET แต่ฉันไม่ได้ลอง โปรไฟล์ 4.5 เป็น super-set ที่เข้มงวดของ 4.0 API บางทีให้มันยิงและรายงานกลับ

แก้ไข: ดูเหมือนว่าคุณสามารถใช้ Visual Studio Async CTP ในการผลิตได้ในขณะนี้

นี่คือสิ่งที่กล่าวในหน้าดาวน์โหลด :

รวม EULA ใหม่สำหรับใช้ในการผลิต หมายเหตุ - ใบอนุญาตนี้ไม่ได้เป็นการสนับสนุนให้คุณใช้ CTP สำหรับรหัสการผลิตของคุณ CTP ยังคงเป็นตัวอย่างเทคโนโลยีที่ไม่ได้รับการสนับสนุนและใช้งานตามความเสี่ยงของคุณเอง อย่างไรก็ตามเราได้รับคำขอมากมายจากนักพัฒนาเพื่อใช้ CTP สำหรับรหัสการผลิตและดังนั้นจึงได้เปลี่ยนใบอนุญาตเพื่อให้อนุญาต


สิ่งที่ฉันใช้ในการพัฒนาคือปัญหาเล็กน้อย ปัญหาสำคัญคือสิ่งที่ฉันควรมอบให้กับผู้ใช้ WinXP ของฉัน คุณแนะนำ bundle mono 2.12 กับแอปพลิเคชันของฉันหรือไม่
— CodesInChaos

เมื่อวานนี้ฉันดูที่แหล่งข้อมูลโมโนและอย่างน้อยหลาย ๆ คลาส async หลัก ( Async...Builderและ...Awaiter) นั้นยากมากที่จะแยกออกจากส่วนที่เหลือของโมโน ขณะนี้ฉันกำลังมองหาการนำไปใช้AsyncCtpLibraryใหม่อาจยืมมาจากโมโน
— CodesInChaos

เมื่อวันที่แจกจ่าย AsyncCtpLibraryฉันรู้ว่ามันเป็นไปได้ในหลักการ แต่สำหรับใบอนุญาตหนึ่งใบมีประโยคแปลก ๆ สองสามข้อ แต่ปัญหาหลักของฉันที่นี่คือสิ่งที่เกิดขึ้นในระยะยาว หากมันไม่ได้รับการสนับสนุนและไม่มีใครแก้ไขข้อผิดพลาดในนั้นมันอาจจะน่ารำคาญ
— CodesInChaos

2

ถ้าคุณต้องการเริ่มแจกจ่ายซอฟต์แวร์ของคุณหลังจากที่ MS ออก C # 5.0 คุณสามารถเริ่มพัฒนาโดยใช้ AsycnCTP มิฉะนั้นฉันจะไม่แนะนำให้คุณใช้เพราะมันเป็นเพียง CTP ไม่ใช่แม้แต่เบต้า มันสามารถเปลี่ยนแปลงได้มากใกล้เคียงกับเวทีเบต้าและการเปิดตัว มันอาจไม่เสถียร ฯลฯ

หากคุณต้องการแนะนำการใช้งาน async อย่างง่าย ๆ ในแอปพลิเคชั่นของคุณฉันอยากจะแนะนำให้คุณใช้ส่วนขยายแบบรีแอกทีฟและสิ่งต่าง ๆ ที่อยู่ด้านบน (Reactive UI, ฯลฯ ) มันเป็นสิ่งที่สวยงาม

สำหรับ VS2012 มันยังมี Async CTP เท่าที่ฉันจำได้จาก // Build / แท็บเล็ต MS ที่ให้การประชุมครั้งนั้น


1
ฉันไม่สนใจที่จะรอการเปิดตัว VS2012 ฉันคาดว่า VS2012 จะวางจำหน่ายก่อนซอฟต์แวร์ของฉันจะอัลฟ่า แต่แม้กระทั่งเมื่อมีการเปิดตัว VS2012 ฉันก็ไม่ต้องการกำหนดเป้าหมายเป็น. net 4.5 เนื่องจากดูเหมือนว่าจะไม่สามารถใช้งานได้บน WinXP ดังนั้นประเด็นหลักคือ async runtime ที่จะใช้บน. net 4
— CodesInChaos
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.