Sử dụng async-await trên .net 4


137

Tôi hiện đang bắt đầu tạo một ứng dụng sẽ thu được nhiều lợi nhuận từ tính năng chờ đợi không đồng bộ của C # 5. Nhưng tôi không chắc nên sử dụng phiên bản nào của VS và thời gian chạy không đồng bộ.

Nhìn vào biểu đồ mức độ phổ biến của hệ điều hành, tôi sẽ cần hỗ trợ Windows XP thêm ba năm nữa. Có vẻ như .net 4.5 chỉ chạy trên các phiên bản Windows mới hơn, vì vậy tôi cần nhắm mục tiêu .net 4.0. Các máy phát triển sử dụng Windows 7, vì vậy sử dụng phiên bản VS mới hơn không phải là vấn đề.

Bây giờ tôi cần chọn trình biên dịch để thực hiện việc này:

  • VS2010 với AsyncCTP
  • Xem trước VS2012 (và cuối cùng khi nó đến), đặt mục tiêu thành .net 4.0
  • Mono (Có vẻ như 2.12 có async-await, tôi thích / tôi quen với VS hơn MonoDevelop như IDE)

Cái nào có ít lỗi code-gen? Nhìn vào blog của Jon Skeet, VS2012 Preview sử dụng trình tạo mã không bao giờ hơn CTP.

Và quan trọng hơn là sử dụng thời gian chạy nào?

VS2012 có chứa thời gian chạy không đồng bộ có thể phân phối lại để sử dụng với .net 4 không?

Tôi đã quản lý để biên dịch mã, với phần xem trước, bằng cách tham khảo thời gian chạy AsyncCTP. Nhưng vì CTP có các điều kiện cấp phép lạ, nên đó không giống như một giải pháp dài hạn tốt.

Hoặc tôi nên sử dụng một bên thứ ba thực hiện? Có lẽ mono có một?

Để phân phối thư viện, tôi thích chỉ cần đặt dll vào cùng thư mục với ứng dụng, thay vì một loại trình cài đặt nào đó.

Tôi cũng thích nó nếu các tệp nhị phân của tôi sẽ hoạt động mà không thay đổi trên mono + Linux / MacOS. Vì vậy, thời gian chạy phải tương thích với bất kỳ đơn âm nào (2.12 có thể) đã được tích hợp hoặc cho phép sử dụng trên các hệ điều hành không phải Windows.


1
Tôi không nghĩ bạn sẽ tiến xa với phiên bản CTP vì bạn sẽ không được phép phân phối lại bất cứ thứ gì là một phần của CTP với một ứng dụng thương mại. Chắc chắn có những lỗi ẩn nấp xung quanh và nó chưa được tối ưu hóa cho hiệu suất. Có lẽ bạn sẽ phát triển nó nhanh hơn nhưng khách hàng của bạn sẽ không vui khi cài đặt phần mềm beta có thể can thiệp vào các phiên bản cuối cùng được phát hành.
Alois Kraus

@Alois Các phiên bản sau của AsyncCTP cho phép phân phối lại. Và điều tồi tệ nhất có thể xảy ra là ứng dụng của tôi bị hỏng. Không giống như nó có thể can thiệp vào các ứng dụng khác, vì vậy tôi không hiểu buổi hòa nhạc của bạn qua sự can thiệp với phiên bản cuối cùng. Ngoài ra một phần câu hỏi của tôi là liệu sẽ có phiên bản cuối cùng hỗ trợ WinXP ngay từ đầu không.
CodeInChaos

1
Giấy phép ghi rõ (Async CTP 3) "1.a.ii. bạn đồng ý ngừng sử dụng ngay lập tức khi có thông báo từ Microsoft;". Tôi nghi ngờ thông báo này sẽ đến từ MS khi nó được phát hành. Tôi không phải là luật sư nhưng tôi chắc chắn bộ phận pháp lý của bạn (nếu bạn có) sẽ rất thích nghe lý do của bạn về cách bạn muốn giải quyết vấn đề này mà không vi phạm các điều khoản cấp phép.
Alois Kraus

Câu trả lời:


106

Microsoft đã phát hành Gói nhắm mục tiêu Async (Microsoft.Bcl.Async) thông qua Nuget để thay thế cho AsyncCTP.

Bạn có thể đọc thêm về nó ở đây: http://bloss.msdn.com/b/bclteam/archive/2013/04/17/microsoft-bcl-async-is-now- sóng.aspx .

Bạn có thể đọc về phiên bản trước tại đây: http://bloss.msdn.com/b/lucian/archive/2012/04/24/async-targeting-pack.aspx .

Vì gói này được hỗ trợ chính thức, giờ đây tôi tin rằng tùy chọn tốt nhất để nhắm mục tiêu XP + async sẽ sử dụng Visual Studio 2012 + C # 5 + Gói nhắm mục tiêu Async.

Nếu bạn cảm thấy cần phải nhắm mục tiêu .NET 3.5, bạn vẫn có thể sử dụng (my) AsyncBridge cho .NET 3.5 .


Tôi không thể tìm thấy bất kỳ tài liệu tham khảo nào về giấy phép cho AsyncBridge của bạn?
toong


15
Hãy nhớ rằng việc sử dụng gói nhắm mục tiêu async trên .NET 4.0 yêu cầu phải cài đặt KB2468871.
ghord

KB2468871 đã được phát hành vào tháng 6 năm 2011 (và 6 tháng sau v2 đã được phát hành), nhưng nó vẫn có thể chưa được cài đặt, vì vậy hãy xem cách kiểm tra nó trong WiX - stackoverflow.com/a/9506530/968003 .
Alex Klaus

24

Nếu bạn sẵn sàng xem xét các ngôn ngữ .Net khác, F # có thể giải quyết vấn đề của bạn. Nó đã có biểu thức tính toán async {} trong nhiều năm và tương thích ngược ngay cả với .Net 2.0. Yêu cầu tối thiểu là Windows XP SP3. Thời gian chạy có thể được tải xuống ở đây .


4

Có thể sử dụng VS 12 beta để nhắm mục tiêu .NET 4.0 bằng cách sử dụng async / await.

Bạn cần sao chép một số mã vào dự án của bạn để cung cấp các loại trình biên dịch dựa vào.

Chi tiết tại đây

Chỉnh sửa: chúng tôi đã thực hiện kỹ thuật này và biến nó thành một thư viện mã nguồn mở có tên AsyncBridge: https://nuget.org/packages/AsyncBridge


3

Nếu bạn muốn có thể phân phối phần mềm của mình, tôi nghĩ rằng giải pháp Mono thực sự là lựa chọn duy nhất của bạn ngay bây giờ. Bạn cũng nói rằng bạn muốn kết quả cuối cùng chạy trên Mono trên Linux và OS X. Nhắm mục tiêu Mono bắt đầu với dường như là giải pháp tự nhiên.

Vấn đề tiếp theo của bạn là IDE. MonoDevelop rõ ràng sẽ hoạt động tốt nhưng bạn nói bạn thích Visual Studio.

Greg Hurlman đã tạo một hồ sơ để mã hóa Mono 2.8 từ Visual Studio. Nếu bạn theo dõi anh ta, anh ta có thể chỉ cho bạn đi đúng hướng để phát triển dựa trên Mono 2.11 / 2.12 trong Visual Studio.

Tất nhiên, cũng có Mono Tools cho Visual Studio là một sản phẩm thương mại. Tôi cho rằng nó vẫn đang được cung cấp bởi Xamarin .

Bạn cũng có thể chạy các hội đồng hồ sơ 4,5 yêu cầu từ Mono trên .NET nhưng tôi chưa thử điều đó. Cấu hình 4.5 là một siêu tập hợp nghiêm ngặt của API 4.0. Có lẽ cho nó một shot và báo cáo lại.

EDIT: Có vẻ như có thể bạn có thể sử dụng CTP Visual Studio Async trong sản xuất ngay bây giờ

Đây là những gì nó nói trên trang tải xuống :

Bao gồm một EULA mới để sử dụng sản xuất. Lưu ý - Giấy phép này không cấu thành khuyến khích bạn sử dụng CTP cho mã sản xuất của bạn. CTP vẫn là Bản xem trước công nghệ không được hỗ trợ và sử dụng theo rủi ro của bạn. Tuy nhiên, chúng tôi đã nhận được nhiều yêu cầu từ các nhà phát triển để sử dụng CTP cho mã sản xuất và do đó đã thay đổi giấy phép để cho phép điều đó.


Những gì tôi sử dụng trong phát triển là vấn đề nhỏ. Vấn đề chính là những gì tôi nên trao cho người dùng WinXP của mình. Bạn có đề xuất gói mono 2.12 với ứng dụng của tôi không?
CodeInChaos

Hôm qua tôi đã xem xét các nguồn đơn âm, và ít nhất một số lớp không đồng bộ cốt lõi ( Async...Builder...Awaiter) rất khó tách khỏi phần còn lại của đơn âm. Hiện tại tôi đang xem xét triển khai lại AsyncCtpLibrary, có thể mượn một chút từ đơn âm.
CodeInChaos

Về phân phối lại AsyncCtpLibrary, tôi biết rằng về nguyên tắc là có thể, nhưng đối với một giấy phép có một vài mệnh đề lạ. Nhưng vấn đề chính của tôi ở đây là những gì xảy ra trong thời gian dài. Nếu nó không được hỗ trợ và không ai sửa lỗi trong đó, điều đó có thể gây phiền nhiễu.
CodeInChaos

2

Nếu bạn muốn bắt đầu phân phối phần mềm của mình sau khi MS phát hành C # 5.0, thì bạn có thể bắt đầu phát triển bằng AsycnCTP. Nếu không, tôi sẽ không khuyên bạn nên sử dụng nó, vì nó chỉ là CTP, thậm chí không phải là bản beta. Nó có thể được thay đổi rất nhiều gần với giai đoạn beta và phát hành. Nó có thể không ổn định, vv

Nếu bạn muốn giới thiệu các thao tác async dễ dàng trong ứng dụng của mình, tôi khuyên bạn nên sử dụng Tiện ích mở rộng phản ứng và các công cụ được xây dựng trên đầu (Reactive UI, v.v.), đó chỉ là một cách dễ dàng.

Đối với VS2012, nó cũng chứa Async CTP theo như tôi nhớ từ // Build / tablet MS của tôi đã đưa cho tôi trong hội nghị đó.


1
Tôi không quan tâm đến việc chờ phát hành VS2012. Tôi hy vọng VS2012 sẽ được phát hành trước khi phần mềm của tôi hết alpha. Nhưng ngay cả khi VS2012 được phát hành, tôi không muốn nhắm mục tiêu .net 4.5, vì điều đó dường như không khả dụng trên WinXP. Vì vậy, vấn đề chính là thời gian chạy không đồng bộ sẽ sử dụng trên .net 4.
CodeInChaos
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.