8

Tôi đã tìm thấy Difference between […]Async and Begin[…] .net asynchronous APIs câu hỏi nhưng this answer làm tôi bối rối một chút.APM, EAP và TPL trên Lập trình Socket

Nói về những mô hình, Stephen nói:

Hầu hết các phương pháp * Async (tương ứng với các sự kiện * Completed) đang sử dụng các sự kiện dựa trên mẫu không đồng bộ. Các cũ hơn (nhưng vẫn hoàn toàn hợp lệ) Begin * và End * là một mô hình được gọi là mô hình lập trình không đồng bộ.

Lớp Socket là ngoại lệ đối với quy tắc này; * Các phương thức Async không có bất kỳ sự kiện tương ứng nào; về cơ bản nó chỉ là APM được thực hiện theo cách để tránh phân bổ bộ nhớ quá mức.

Tôi hiểu nó bằng cách sử dụng * Các phương pháp không đồng bộ hiệu quả hơn, ít nhất là khi nói đến ổ cắm. Nhưng sau đó, anh ta đã đề cập đến Thư viện công việc song song:

Tuy nhiên, cả APM và EBAP đều được thay thế bằng cách tiếp cận linh hoạt hơn dựa trên Thư viện song song nhiệm vụ. Vì TPL có thể kết nối dễ dàng các APM, các lớp học cũ hơn có thể sẽ không được cập nhật trực tiếp; các phương thức mở rộng được sử dụng để cung cấp các công việc tương đương cho các phương thức APM cũ.

tôi thấy TPL and Traditional .NET Asynchronous Programming trên MSDN, tôi biết những điều cơ bản của TPL, tạo ra các nhiệm vụ, hủy, continuations, vv nhưng tôi vẫn không hiểu sau đây:

những ưu điểm của Asynchronous Programming Mẫu là gì (APM) và Mẫu không đồng bộ dựa trên sự kiện (EAP) so với nhau? Làm thế nào để TPL có thể bọc APM dễ dàng có nghĩa là cả APM và EAP là được thay thế bằng TPL?

Và quan trọng nhất: Tôi nên sử dụng công cụ nào trong lập trình socket;

  • APM?
  • EAP?
  • APM hoặc EAP được thực hiện bởi một nhiệm vụ?
  • TPL bằng cách sử dụng các phương pháp chặn của lớp Socket trong công việc?
  • Khác?
+0

xem: http://stackoverflow.com/questions/5834755/turning-async-socket-parallel-and-not-only-concurrent- trong-rất-chuyên sâu-applicat –

Trả lời

6

TPL có thể bọc APM dễ dàng có nghĩa là cả APM và EAP đang được thay thế bằng TPL như thế nào?

Không. Wether APM và EAP sẽ được thay thế bằng TAP (Task Asynchronous Pattern) hoặc không phải trong API mới không có gì để làm với điều này. Tôi mong đợi TAP sẽ thay thế APM và EAP vì nhiều lý do khác nhau. Lý do chính đối với tôi là mã bạn viết để sử dụng TAP soạn thảo tốt hơn nhiều. Làm .ContinueWith(/* ... */).ContinueWith(/* ... */) thường đọc tốt hơn nhiều so với mã tương ứng bạn sẽ cần phải viết cho chuỗi cuộc gọi không đồng bộ thông qua Begin/End phương pháp, ngay cả khi bạn không đưa vào tài khoản các tùy chọn bạn có thể vượt qua để ContinueWith để xác định nếu tiếp tục nên chạy. TPL cũng cung cấp các bộ phối hợp khác nhau cho Công việc, chẳng hạn như WaitAllWaitAny, có thể làm cho một số tình huống dễ dàng hơn nhiều. Sự hỗ trợ ngôn ngữ đến trong C# và VB.NET thông qua các từ khóa async/await sẽ làm cho điều này dễ dàng hơn.

Có thể bọc APM trong TAP giúp dễ dàng chuyển sang mẫu này vì điều đó có nghĩa là bạn không phải viết lại mã hiện có để mã phù hợp với mô hình mới.

Tôi nên sử dụng tính năng nào trong lập trình socket?

Tôi khuyên bạn nên sử dụng TAP gói các phương pháp APM trên Ổ cắm. Trừ khi bạn có thể chứng minh rằng chi phí bổ sung của việc gói các phương thức Begin/End vào một Task là sự khác biệt giữa khả năng mở rộng/đủ nhanh hay không, tôi sẽ tận dụng sự dễ dàng mã hóa TAP.

3

Gideon có câu trả lời tuyệt vời; Tôi chỉ muốn cung cấp thêm một số thông tin cơ bản:

Ưu điểm của Mô hình lập trình không đồng bộ (APM) và Mô hình không đồng bộ dựa trên sự kiện (EAP) so với nhau là gì?

APM phổ biến hơn và có mẫu được xác định khá nghiêm ngặt. ví dụ: TPL có các trình bao bọc chung cho các phương thức APM (TaskFactory.FromAsync), nhưng nó không thể làm tương tự cho EAP vì EAP không được xác định đúng.

EAP có một lợi thế lớn: gọi lại sự kiện xử lý chuỗi marshaling cho bạn. Vì vậy, chúng thực sự tốt đẹp cho, ví dụ: hoạt động nền cơ bản cho giao diện người dùng (BackgroundWorker).

TAP kết hợp tốt nhất của cả hai thế giới: marshaling chuỗi tự động theo mặc định và mô hình chung được xác định nghiêm ngặt. Nó cũng có một đại diện đối tượng tốt đẹp cho một hoạt động không đồng bộ (Task).

Làm thế nào để "TPL có thể bọc APM dễ dàng" có nghĩa là "cả APM và EAP đang được thay thế bằng TPL"?

Không.

"Tuy nhiên, cả APM và EBAP đều được thay thế bằng cách tiếp cận linh hoạt hơn nhiều dựa trên Thư viện song song nhiệm vụ". - có nghĩa là mã mới không cần bao gồm các phương thức/sự kiện APM/EAP; mã mới nên bao gồm các phương thức TAP thay thế.

"Vì TPL có thể bao bọc APM dễ dàng, các lớp cũ sẽ không được cập nhật trực tiếp; các phương pháp mở rộng được sử dụng để cung cấp Tương đương tác vụ cho các phương pháp APM cũ." - nghĩa là bạn có thể thêm các phương thức TAP vào loại APM hiện có bằng cách sử dụng TaskFactory.FromAsync; Tôi cho rằng nhóm TPL sẽ thực hiện phương pháp này thay vì sửa đổi một tấn các lớp trong BCL. Tuy nhiên, tôi đã sai trong phỏng đoán này. Vì lý do hiệu suất, nhóm BCL/TPL đã xem xét toàn bộ khuôn khổ và thêm các phương thức TAP trực tiếp vào các lớp .NET thay vì sử dụng các phương thức mở rộng. Các phương pháp TAP mới được bao gồm trong .NET 4.5, sắp có ...

+1

TAP không làm chủ đề marshaling của chính nó. Nhưng TAP trong sự kết hợp với 'await'. – svick

+1

Tôi nghĩ điều này phụ thuộc vào định nghĩa "TAP". Tôi bao gồm 'async' và 'await' trong TAP. –

Các vấn đề liên quan