2014-11-11 15 views
5

Tôi hiện đang học C# đến từ nền java. Để làm ướt chân tôi, tôi quyết định tạo một ứng dụng thư SMTP đơn giản. Và tôi đã học rất nhanh rằng C# cung cấp hỗ trợ cho cả hai ổ cắm Đồng bộ và Không đồng bộ. Từ những gì tôi có thể thấy, không có lợi thế thực sự nào khi sử dụng một ổ cắm đồng bộ và không đồng bộ vì ổ cắm không đồng bộ và do đó không yêu cầu bạn phải tạo một luồng mới mỗi lần. Có vẻ như không phải là một chi phí đáng chú ý để sử dụng cái này hay cái kia.Lợi thế của Đồng bộ so với không đồng bộ trong kết nối cổng TCP

Vì vậy, câu hỏi của tôi là điều này, có một lợi thế để sử dụng một ổ cắm đồng bộ hoặc là nó tốt hơn để chỉ dính với không đồng bộ trong hầu hết các trường hợp?

+1

Tất cả phụ thuộc vào tình huống, tôi sẽ nói trong 99% trường hợp bạn sẽ sử dụng không đồng bộ và trong đồng bộ hiếm 1% nơi bạn muốn đảm bảo rằng email được gửi chắc chắn và khối mã đó đã hoàn thành và tiếp tục với chương trình sau đó. Ngoài ra nếu bạn thực hiện các chủ đề của riêng bạn cho đổ này, bạn cũng sẽ sử dụng đồng bộ. – Vajura

+0

Tôi cho rằng đó là trường hợp. Nhưng tôi cũng nghĩ rằng bạn có thể làm điều tương tự với không đồng bộ. Hoặc là tôi sai? –

+2

@MuhammadHijazi Bạn có thể, bạn nói đúng. Funcationally, có ** không ** khác biệt giữa việc sử dụng async hoặc ổ cắm đồng bộ nào. – dcastro

Trả lời

6

Cơ chế nào sẽ hoạt động. Sự khác biệt chính là đồng bộ ngụ ý ngăn chặn một luồng mà nếu không sẽ làm những việc hữu ích khác, hoặc cống hiến một sợi cho mỗi kết nối. Dù bằng cách nào, điều này không quy mô rất tốt. Đối với các ứng dụng đơn giản có ít hoặc chỉ một kết nối hoạt động, có thể không sao.

Nhưng đối với bất kỳ trường hợp nào bạn cần xử lý bất kỳ số lượng đáng kể kết nối đồng thời nào, các API không đồng bộ là các API duy nhất cung cấp hiệu suất phù hợp. Ngoài ra, trong bất kỳ kịch bản tương tác nào (tức là nơi bạn phải đối phó với đầu vào và đầu ra của người dùng), cách tiếp cận không đồng bộ được tích hợp dễ dàng hơn với giao diện người dùng. Điều đó đặc biệt đúng khi chúng tôi có asyncawait trong C#.

+0

Lưu ý rằng để thực hiện đúng, các API đồng bộ ngụ ý một luồng cho socket của bộ nghe và * hai * luồng cho mỗi kết nối máy khách. –

+0

Điều đó tùy thuộc vào giao thức ứng dụng. Các giao thức yêu cầu/phản hồi đơn giản không yêu cầu nhận và gửi đồng thời và có thể được xử lý trong một luồng đơn. –

+0

Chỉ khi mọi thứ đều hoàn hảo. Giao thức yêu cầu/phản hồi "đơn giản" không thể phát hiện tình trạng nửa mở, đòi hỏi ít nhất một bộ hẹn giờ để phục hồi. –

5

Async IO lưu chủ đề. Một chủ đề tiêu thụ (thường) 1MB bộ nhớ ngăn xếp. Đây là lý do chính để sử dụng IO không đồng bộ khi số lượng hoạt động IO xuất hiện đồng thời trở nên lớn. Theo số đo của tôi, khả năng mở rộng của hệ điều hành không phải là mối quan tâm cho đến khi bạn nhận được hàng nghìn chủ đề.

Những bất lợi chính là nó đòi hỏi nhiều nỗ lực phát triển để làm cho cùng một ứng dụng hoạt động ở cùng một mức độ tin cậy.

I have written about this tradeoff at length. Ngoài ra: Should we switch to use async I/O by default?

Đó là lời khuyên khách quan sai lầm khi khuyên bạn nên luôn luôn sử dụng async IO.

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