2011-10-16 32 views
21

Tôi mới tham gia WCF. Ban đầu tôi đã tạo một dịch vụ WCF và sử dụng proxy máy khách được tạo để tiêu thụ dịch vụ từ máy khách. Vì vậy, bất cứ khi nào tôi thực hiện một số thao tác trên dịch vụ, mọi thứ được thực hiện tuần tự khi tôi gọi các phép toán đồng bộ. Tôi đã thay đổi chế độ đồng thời thành nhiều, nhưng các thao tác vẫn diễn ra đồng bộ. Sau đó, tôi tạo các phương thức không đồng bộ cho các hoạt động của mình và sử dụng các mẫu bắt đầu/kết thúc để tôi đoán "giải phóng" kênh và cho phép các hoạt động xảy ra song song/không đồng bộ làm tăng thông lượng của các ứng dụng của tôi.WCF - nhà máy kênh và cơ sở khách hàng

Sau đó, tôi đã sử dụng ChannelFactory để tạo kênh và thực hiện các thao tác khi máy khách và máy chủ có thể chia sẻ hợp đồng (cùng một dự án). Nhưng IClientChannel chỉ cung cấp BeginOpen/EndOpen/BeignClose/EndClose. Nó không có các phương thức BeginOperation/EndOperation của . Vì vậy, về cơ bản tôi không thể thực hiện một hoạt động không đồng bộ trên kênh để giải phóng để tôi có thể sử dụng kênh để thực hiện các hoạt động khác.

Các tôi chỉ đơn giản là tạo ra các kênh cho mọi hoạt động và nó đã giải quyết được vấn đề

Vì vậy, câu hỏi của tôi là:

  1. Đó là tốt hơn (ClientBase vs. ChannelFactory) wrt để kịch bản của tôi đặc biệt tôi muốn thực hiện nhiều hoạt động trên đối tượng dịch vụ đồng thời với nhiều chủ đề

  2. Bạn có nên tạo kênh cho từng hoạt động không?

  3. Thực tế, tôi nghĩ chúng tôi chỉ có thể có một kênh giữa hai điểm cuối (máy khách/dịch vụ). Nhưng tôi có thể tạo bao nhiêu kênh tùy thích. Ví dụ: Tôi có thể tạo Int16.MaxValue của kênh. Vì vậy, không chắc chắn những gì giới hạn và khuyến nghị về điều này.

    Service[] channels = new IService[Int16.MaxValue]; 
    
    for(int i = 0; i<Int16.MaxValue; i++) 
    { 
        channels[i] = factory.CreateChannel(); 
    } 
    

Vì vậy, về cơ bản bạn có thể vui lòng cho tôi biết về những điều cơ bản của các kênh truyền hình và các khuyến nghị và thủ thuật vv ... vv .. :)

Trả lời

26

Có sự khác biệt sử dụng async giữa ClientBaseChannelFactory<T>. Về cơ bản, ClientBase sử dụng mô hình không đồng bộ theo hướng sự kiện.

Tôi đã sử dụng ChannelFactory<T> rộng rãi trong một ứng dụng tôi đã phát triển tại cơ quan, chủ yếu là vì các hợp đồng có sẵn trong thư viện chung cho ứng dụng và tôi không thích sử dụng Tham chiếu dịch vụ bổ sung. Tôi nhớ cache từng cá thể duy nhất của ChannelFactory khi tạo, và sau đó khi tôi cần gọi một hoạt động, tôi sẽ mở một kênh giao tiếp từ cá thể đó, thực hiện cuộc gọi của tôi và đóng kênh giao tiếp.

Hầu hết chi phí khởi động cho WCF là tạo ra ứng dụng khách, và theo cách này bạn chỉ trả tiền một lần cho suốt thời gian của ứng dụng - việc tạo kênh truyền thông là không đáng kể.

Để biết thêm về các async cho ClientBaseChannelFactory<T>, xem:

How to: Call WCF Service Operations Asynchronously

How to: Call Operations Asynchronously Using a Channel Factory

+0

Cảm ơn Tim. Vâng, tôi cũng đang làm điều tương tự. Tạo một kênh giao tiếp mới cho mỗi hoạt động và đóng nó lại. Tôi nhìn vào các liên kết, nhưng tôi vẫn còn một số câu hỏi.1. Bạn nên sử dụng bao nhiêu kênh? 2. Để thực hiện các hoạt động đồng bộ bằng cách sử dụng nhà máy kênh, chúng ta chỉ cần thêm các phương thức BeginOp/EndOp vào giao diện kênh. phần còn lại tất cả mọi thứ được đưa về chăm sóc bởi WCF - trong lời nói ồ ạt svcutil util tạo ra rất nhiều mã mà chúng tôi không quan tâm. chúng tôi chỉ quan tâm đến định nghĩa giao diện và để WCF thực hiện việc nâng hạng nặng. Nếu có, điều này thật tuyệt. \ – Dreamer

+0

Câu hỏi ngoài những câu hỏi trên? – Tim

+0

@Dreamer - Tôi không nghĩ rằng có bất kỳ số kênh được đề xuất nào. Nếu bạn có nhiều khách hàng, bạn có thể gặp sự cố kết nối đồng thời, nhưng bạn có thể điều chỉnh trong cấu hình. Đối với câu hỏi thứ hai của bạn, tôi đã không làm bất cứ điều gì async trong WCF được nêu ra (chúng tôi đang sẵn sàng để làm điều đó trong rev tiếp theo của chúng tôi tại nơi làm việc), nhưng tôi sẽ nghĩ miễn là giao diện là chính xác, bạn nên ok. – Tim

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