Cách duy nhất để có hai máy khách WCF khác nhau, tức là, proxy, tham chiếu cùng một phiên bản dịch vụ WCF của bạn là sử dụng InstanceContextMode=InstanceContextMode.Single
. Đây là một lựa chọn không tốt nếu mở rộng quy mô là một vấn đề, vì vậy bạn muốn sử dụng PerCall
nếu có thể.
Khi bạn sử dụng PerCall
, mỗi CALL đến các dịch vụ WCF được phục vụ riêng dụ WCF nó. Không có sự chia sẻ của cá thể dịch vụ, nhưng điều đó không có nghĩa là chúng không chia sẻ cùng một lưu trữ back-end (ví dụ: cơ sở dữ liệu, bộ nhớ, tệp, v.v.). Chỉ cần nhớ, PerCall
cho phép mỗi gọi để truy cập dịch vụ WCF của bạn cùng một lúc.
Cài đặt ConcurrencyMode
kiểm soát mô hình luồng của chính dịch vụ. Cài đặt Single
hạn chế tất cả các phiên bản dịch vụ WCF để chạy trên cùng một chuỗi. Vì vậy, nếu bạn có nhiều khách hàng kết nối cùng một lúc, họ sẽ chỉ được thực hiện một lần tại một bên dịch vụ WCF. Trong trường hợp này, bạn sử dụng WCF để cung cấp đồng bộ hóa. Nó sẽ hoạt động tốt, như bạn đã thấy, nhưng hãy nghĩ về điều này khi chỉ có điều khiển mức vĩ mô trên đồng bộ hóa - mỗi cuộc gọi dịch vụ WCF sẽ thực hiện toàn bộ trước khi cuộc gọi tiếp theo có thể thực thi.
Đặt ConcurrencyMode
thành Multiple
, tuy nhiên, sẽ cho phép tất cả các phiên bản dịch vụ WCF thực thi đồng thời. Trong trường hợp này, bạn chịu trách nhiệm cung cấp đồng bộ hóa cần thiết. Hãy nghĩ về điều này là có điều khiển mức vi mô trên đồng bộ hóa vì bạn chỉ có thể đồng bộ hóa các phần của mỗi cuộc gọi cần được đồng bộ hóa.
Tôi hy vọng tôi đã giải thích này cũng đủ, nhưng đây là một đoạn trong tài liệu MSDN cho ConcurrencyMode
chỉ trong trường hợp:
Setting ConcurrencyMode để đơn lệnh cho hệ thống để hạn chế thể hiện của các dịch vụ cho một thread thực hiện tại một thời điểm, giải phóng bạn xử lý các vấn đề về luồng . Giá trị Đa có nghĩa là các đối tượng dịch vụ có thể được thực hiện bởi nhiều chủ đề cùng một lúc. Trong trường hợp này, bạn phải đảm bảo an toàn cho chủ đề .
EDIT
Bạn hỏi
Có bất kỳ sự gia tăng hiệu suất, sau đó, sử dụng PerCall vs Độc thân khi sử dụng ConcurrencyMode.Single? Hay là ngược lại đúng?
Điều này có thể phụ thuộc vào dịch vụ.
Với InstanceContextMode.PerCall
, một cá thể dịch vụ mới được tạo cho mỗi và mọi cuộc gọi qua proxy, do đó bạn có phí tạo đối tượng để xử lý. Giả sử nhà xây dựng dịch vụ của bạn không làm được gì nhiều, điều này sẽ không thành vấn đề.
Với InstanceContextMode.Single
, chỉ một phiên bản dịch vụ tồn tại trong suốt thời gian tồn tại của ứng dụng, vì vậy thực tế không có phí liên quan đến việc tạo cá thể. Tuy nhiên, chế độ này chỉ cho phép một cá thể dịch vụ xử lý mọi cuộc gọi sẽ được thực hiện. Vì vậy, nếu bạn có nhiều cuộc gọi được thực hiện đồng thời, mỗi cuộc gọi sẽ phải đợi cho các cuộc gọi khác kết thúc trước khi nó có thể được thực thi.
Đối với những gì đáng giá, dưới đây là cách tôi đã thực hiện việc này. Sử dụng ngữ cảnh ngữ cảnh PerCall
với Multiple
đồng thời. Bên trong lớp dịch vụ WCF của bạn, tạo các thành viên tĩnh để quản lý lưu trữ dữ liệu phía sau cho bạn, và sau đó đồng bộ hóa quyền truy cập vào các thành viên tĩnh này khi cần sử dụng câu lệnh lock
, volatile
, v.v. an toàn chủ đề.
Bạn chắc chắn đóng đinh sự ngắt kết nối khác của tôi. Vì vậy, sử dụng 'ConcurrencyMode.Multiple', bất kể InstanceContextMode, có nghĩa là bạn đang sử dụng các câu lệnh' lock' xung quanh các phần quan trọng và thực hiện các kiểm tra đồng bộ/an toàn luồng khác. Có tăng hiệu năng nào không, sau đó, sử dụng 'PerCall' và' Single' khi sử dụng 'ConcurrencyMode.Single'? Hay là ngược lại đúng? –
http://msdn.microsoft.com/en-us/library/ms731193.aspx –
Đây là tất cả thông tin tuyệt vời. Cảm ơn vì đã quá thấu đáo; Tôi nhận được rất nhiều từ nó. –