2009-04-21 26 views
12

Trong khoảng thời gian đã lên lịch, tôi cần gọi dịch vụ WCF gọi một Dịch vụ WCF khác một cách đồng bộ. Lập kế hoạch một cuộc gọi đến một dịch vụ WCF tôi đã làm việc ra ngoài.Cần lửa mẫu và quên cuộc gọi không đồng bộ tới dịch vụ WCF

Điều tôi nghĩ tôi cần và tôi đã đọc ở đây về stackoverflow cần thiết .., (trong bản chất) chuẩn bị hoặc thay đổi mã của các dịch vụ WCF của bạn để có thể xử lý cuộc gọi không đồng bộ với họ. Nếu vậy thì một ví dụ đơn giản của nó sẽ như thế nào? (Có thể là trước và sau ví dụ) Ngoài ra nó vẫn còn cần thiết trong .Net 3.5? Thứ hai Tôi đang sử dụng một proxy từ Dịch vụ WCF thực hiện cuộc gọi đến WCF Service tiếp theo và cần một ví dụ về cuộc gọi không đồng bộ với dịch vụ WCF nếu có vẻ khác với những gì điển hình với BeginEnvoke và EndEnvoke với tính năng không đồng bộ thông thường ví dụ.

Tôi tin rằng nếu tôi hoàn toàn không có câu hỏi của mình và sẽ đánh giá cao bất kỳ sự điều chỉnh nào để thiết lập một câu hỏi hay hơn.

+0

Rất nhiều mẫu tuyệt vời tại [IDesign.net] (http://idesign.net/idesign/DesktopDefault.aspx?tabindex=5&tabid=11#ConcurrencyManagement) bao gồm các ví dụ về quản lý đồng thời. –

Trả lời

22

Đặt thuộc tính IsOneWay thuộc tính OperationContract thành true trên phương thức WCF mà bạn đang gọi đến. Điều này nói với WCF rằng cuộc gọi chỉ quan trọng đối với một hướng và khách hàng sẽ không treo xung quanh cho phương thức để hoàn thành việc thực thi.

Ngay cả khi gọi BeginInvoke, mã khách hàng của bạn sẽ vẫn bị treo chờ đợi cho phương thức máy chủ để hoàn thành việc thực thi nhưng nó sẽ làm điều đó trên một luồng threadpool.

[ServiceContract] 
interface IWCFContract 
{ 
    [OperationContract(IsOneWay = true)] 
    void CallMe() 
} 

Cách khác để thực hiện những gì bạn muốn là để dịch vụ WCF quay công việc của mình thành chuỗi nền và quay lại ngay lập tức.

+0

Khách hàng vẫn có thể bị chặn cho đến khi dịch vụ nhận được cuộc gọi (gọi phương thức). tùy thuộc vào định nghĩa đồng thời của dịch vụ và/hoặc sự tồn tại của phiên truyền tải. – Menahem

7

Hãy chắc chắn kiểm tra cẩn thận cách thực hiện cuộc gọi WCF OneWay. Tôi đã nhìn thấy nó gian hàng khi bạn đạt đến X số cuộc gọi đồng thời, như thể WCF thực sự chờ đợi cho các cuộc gọi kết thúc.

Một giải pháp an toàn hơn là phải có mã "target" return control ASAP: Thay vì để nó xử lý cuộc gọi đầy đủ, làm cho nó chỉ đưa dữ liệu vào hàng đợi và trả về. Có một cuộc thăm dò chuỗi khác mà hàng đợi và làm việc trên dữ liệu một cách không đồng bộ.

Và đảm bảo áp dụng cơ chế an toàn chủ đề để tránh xung đột giữa hai chuỗi hoạt động trên hàng đợi đó.

0

Không sử dụng BeginInvoke hoặc thậm chí là một chuỗi cho mẫu của bạn. Hãy chắc chắn rằng bạn trang trí các lớp học của bạn với AsyncPattern theo trang web của Microsoft, nếu không đại biểu và chủ đề Async của bạn sẽ được chạy trong một chế độ đồng bộ. WCF ép buộc hành vi này. Thông tin này đã được đăng bởi một op khác, người đã tìm thấy một giải pháp để chặn câu hỏi callbacks trên stack .. xin lỗi nhưng tôi không nhớ liên kết.

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