ใช้ 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.