2011-12-16 32 views
5

Các từ ngữ của câu hỏi không nhất thiết phải thực hiện công lý vấn đề ...Cách tốt nhất để giao tiếp giữa dịch vụ WCF và các luồng riêng biệt là gì?

  • Tôi đã có một giao diện người dùng của khách hàng ngồi trên một hộp địa phương với và dịch vụ cửa sổ nền để hỗ trợ nó trong khi nó thực hiện chức năng nền .
  • Giao diện người dùng của khách hàng chỉ là lớp trình bày và dịch vụ cửa sổ thực hiện tất cả hành động nhấn mạnh ... vì vậy cần có sự giao tiếp giữa hai người trong số họ. Sau khi dành một thời gian trên google và đọc các phương pháp hay nhất, tôi quyết định tạo lớp dịch vụ bằng WCF và đặt tên là pipe.
  • Giao diện người dùng của khách hàng là máy khách WCF và dịch vụ cửa sổ hoạt động như máy chủ lưu trữ WCF (chỉ lưu trữ cục bộ) để hỗ trợ ứng dụng khách.

Vì vậy, điều này làm việc tốt, như nó phải. Giao diện người dùng của khách hàng có thể chuyển dữ liệu đến máy chủ lưu trữ WCF. Nhưng câu hỏi của tôi là, làm cách nào để làm cho dữ liệu đó hữu ích? Tôi đã có một vài động cơ chạy trên các cửa sổ dịch vụ/WCF máy chủ lưu trữ nhưng các máy chủ WCF là hoàn toàn không biết về sự tồn tại của bất kỳ công cụ nền. Tôi cần các yêu cầu liên lạc của khách hàng để có thể tương tác với những động cơ đó.

Có ai có ý tưởng về mẫu thiết kế hay phương pháp hay về cách tiếp cận tạo điều kiện giao tiếp giữa máy chủ lưu trữ WCF và chủ đề đang chạy không?

+0

Bạn đang nói về mẫu kiểu hàng đợi tin nhắn? Và bạn cần phải xếp hàng nhiệm vụ không đồng bộ và sau đó báo cáo lại cho khách hàng sau khi hoàn thành? – slugster

Trả lời

3

Tôi nghĩ rằng đặt cược tốt nhất của bạn là có một số thuộc tính hoặc phương thức tĩnh có thể được sử dụng để trao đổi dữ liệu giữa các luồng/quy trình dịch vụ và dịch vụ WCF. Ngoài ra, cách chúng tôi tiếp cận điều này là thông qua việc sử dụng cơ sở dữ liệu, nơi máy khách hoặc dịch vụ wcf xếp hàng các yêu cầu dịch vụ để phản hồi và dịch vụ, khi có, cập nhật cơ sở dữ liệu với các phản hồi những yêu cầu đó. Các khách hàng sau đó thăm dò ý kiến ​​cơ sở dữ liệu (thông qua WCF) một cách thường xuyên để lấy kết quả của bất kỳ yêu cầu xuất sắc.

Ví dụ: nếu khách hàng cần báo cáo được tạo, chúng tôi sẽ gửi yêu cầu qua WCF và WCF tạo yêu cầu tạo báo cáo trong cơ sở dữ liệu.

Dịch vụ chịu trách nhiệm tạo báo cáo thường xuyên thăm dò bảng này và khi tìm thấy một mục mới, nó quay ra một luồng/quy trình mới tạo báo cáo.

Khi báo cáo đã hoàn tất (thành công hoặc thất bại), dịch vụ sẽ cập nhật bảng cơ sở dữ liệu với kết quả.

Trong khi đó, khách hàng yêu cầu dịch vụ WCF một cách thường xuyên nếu bất kỳ báo cáo đã gửi nào đã hoàn thành. Các WCF dịch vụ lần lượt thăm dò bảng cho bất kỳ yêu cầu đã được hoàn thành, nhưng không được giao cho khách hàng nào được nêu ra, tập hợp các thông tin từ họ, và trả lại chúng cho khách hàng.

Cơ chế này cho phép chúng ta làm một vài điều:

1) Chúng ta có thể mở rộng số lượng các dịch vụ chế biến những yêu cầu trên nhiều máy vật lý/ảo như tăng khối lượng công việc.

2) Một dịch vụ nhất định có thể hỗ trợ nhiều khách hàng.

3) Thông qua giao diện WCF, chúng tôi có thể mở rộng hỗ trợ này cho bất kỳ nền tảng ứng dụng nào mà chúng tôi chọn để hỗ trợ (web, giành chiến thắng, máy tính bảng, điện thoại, v.v.).

Quên đề cập:

Chỉ vì chúng tôi chọn sử dụng cơ sở dữ liệu không có nghĩa là bạn phải triển khai mẫu này. Bạn có thể dễ dàng thực hiện cùng một chức năng bằng cách tạo một bộ sưu tập yêu cầu tĩnh mà dịch vụ WCF và dịch vụ công nhân truy cập theo cùng một cách mà chúng ta sử dụng cơ sở dữ liệu.

Bạn sẽ chỉ cần phải rất cẩn thận về việc lấy và giải phóng các khóa trên các thuộc tính tĩnh để tránh va chạm chéo hoặc deadlocks.

+0

Tôi nghĩ rằng bạn đã chết với điều này. Tôi đã suy nghĩ về việc sử dụng một bảng cơ sở dữ liệu (s) như một luồng tin nhắn, nhưng tôi hơi lo lắng về chi phí khi nó liên quan đến các bản ghi cơ sở dữ liệu (xem làm thế nào có thể có số lượng N khách hàng giao tiếp với máy chủ của họ). "Bạn quên đề cập" là kế hoạch tốt nhất tôi nghĩ vì tôi có thể sử dụng cấu trúc hàng đợi tĩnh để enqueue thư chứ không phải là giữ chúng ở nơi mà chúng sẽ không có giá trị sau khi được hoàn thành. Bằng cách này, nếu tôi sử dụng các thủ tục khóa luồng thích hợp, tôi có thể truy cập các thông báo tĩnh và khử chúng khi cần thiết. Cảm ơn bạn rất nhiều. – jermny

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