2011-01-13 18 views
7

Tôi phải thiết kế và thực hiện một cách để giải quyết các quy trình đang chạy trong ứng dụng khách/máy chủ. Một quá trình chạy dài điển hình sẽ có thể mất 2-3 phút. Tôi cũng cần báo cáo tiến độ cho giao diện người dùng trong thời gian chờ đợi và giữ cho giao diện người dùng phản hồi.Thông báo tiến trình trong WCF cho các quy trình chạy dài - Cách thực hiện?

Có những trong tâm trí của tôi, tôi mặc dù một số giải pháp:

  • Một yêu cầu async để bắt đầu quá trình đó bắt đầu quá trình server-side và trả về một LRPID giao (Long Running Process ID) sau đó thăm dò định kỳ từ khách hàng sử dụng LRPID đó. (Pro: đơn giản để triển khai, không có tường lửa phiền xung quanh Côn: Unelegant, tiêu thụ tài nguyên, vv)

  • Sử dụng một duplex ràng buộc (như NetTcpBinding) và bắt đầu callbacks từ máy chủ như tiến bộ đang được thực hiện (Pro: Elegant, hiệu quả, Côn: Triển khai cơn ác mộng)

  • [gợi ý của bạn ???]

Điều gì sẽ xảy ra với bạn?

+0

Ứng dụng phía máy khách được viết bằng gì? –

+0

Cơn ác mộng triển khai? Tại sao, vì IIS/WS? Sau đó, không sử dụng chúng. –

+0

@Daniel Auger: Ứng dụng khách được viết trong WPF –

Trả lời

4

Đây là post bởi Dan Wahlin về cách tạo chỉ báo tiến trình WCF cho ứng dụng Silverlight. Đây sẽ là một số trợ giúp.

+0

trông khá tuyệt, tôi sẽ phải tìm thêm một chút nữa.Cảm ơn! –

+0

Ok, điều này được chứng minh là cách tốt nhất giữa! Đặc biệt là bởi vì '" ... Nó khởi tạo một yêu cầu mạng, và sau đó yêu cầu có hiệu quả "đưa vào giấc ngủ" chờ đợi cho máy chủ để đáp ứng (nó không trở lại ngay lập tức) .Server sau đó giữ kết nối mở nhưng không hoạt động cho đến khi nó có thứ gì đó để gửi lại (hoặc thời gian kết nối sau 90 giây - tại thời điểm đó máy khách song công sẽ kết nối lại và chờ). Bằng cách này, bạn sẽ không gặp phải máy chủ nhiều lần - nhưng vẫn nhận được phản hồi ngay lập tức khi có dữ liệu để gửi. " –

+0

hoặc nói cách khác, hệ thống bỏ phiếu đã được triển khai, có trọng lượng nhẹ và hiệu quả mô phỏng phiên bản hai chiều thực sự –

1

Nếu bạn không muốn phải lo lắng về tường lửa của khách hàng, v.v ... tôi có thể đi với giải pháp đầu tiên của bạn và sử dụng BackGroundWorker để thực hiện cuộc gọi nhằm ngăn chặn chặn chuỗi giao diện người dùng. Tôi đã làm điều này gần đây cho một ứng dụng mà yêu cầu tạo báo cáo được đặt trên hàng đợi và được truy lục sau khi hoàn thành. Có vẻ như để làm việc tốt.

0

Cách khác (không phải thay đổi ràng buộc WCF) là sử dụng điều khiển WebBrowser trong trình khách WPF và SignalR để đăng thông báo tiến trình từ máy chủ lên điều khiển đó. Lưu ý rằng để tránh các lỗi javascript xảy ra với điều khiển WebBrowser (vì theo mặc định có vẻ như sử dụng Internet Explorer phiên bản 7 có vẻ không tương thích với jQuery.js), bạn sẽ cần phải thêm các khóa vào đăng ký trên máy khách để thay đổi mặc định cho ứng dụng khách để sử dụng IE10 trở lên - xem http://weblog.west-wind.com/posts/2011/May/21/Web-Browser-Control-Specifying-the-IE-Version). Điều này có thể là một sự phiền toái khi triển khai (vì các quyền quản trị dường như là cần thiết - ví dụ như trên Windows 8.1 64 bit - để thêm các khóa registry). Ngoài ra, nó vẫn có vẻ cần thiết để gọi các WCF chạy dài phương pháp trong một chủ đề riêng biệt, nếu không điều khiển WebBrowser dường như không cập nhật hiển thị của nó để hiển thị các tin nhắn SignalR nó nhận được. (Điều này có ý nghĩa bởi vì thread UI sẽ phải chờ cho đến khi cuộc gọi WCF kết thúc).

Nhưng tôi đề cập đến nó như một phương pháp thay thế bằng cách sử dụng công cụ mới hơn (SignalR) :)