2012-07-26 37 views
5

Tôi đoán rằng tất cả việc thực hiện ngay lập tức ngừng và kết thúc cuộc gọi sẽ hết thời gian chờ. Điều gì xảy ra chính xác khi bạn ngừng một dịch vụ và bạn có bao nhiêu quyền kiểm soát đối với dịch vụ đó?Điều gì sẽ xảy ra nếu tôi ngừng Dịch vụ Windows trong khi đang xử lý yêu cầu WCF?

+1

Dịch vụ Windows nào? Nó có phải là thứ bạn viết không? Điều này hoàn toàn phụ thuộc vào cách dịch vụ xử lý yêu cầu tắt máy. Nó có thể được viết để hoàn thành công việc hiện tại của nó hay không. – James

+0

Bạn đã tự mình thử nghiệm chưa? Thế kết quả là gì? – Bernard

+1

Tôi sẽ viết câu trả lời đúng ... nhưng dude ... TEST IT mình! Chỉ mất vài giây để tự mình kiểm tra. – Eiver

Trả lời

4

Khi Trình quản lý kiểm soát dịch vụ thông báo cho dịch vụ của bạn dừng, .Net ServiceBase đặt trạng thái thành SERVICE_STOP_PENDING và gọi phương thức OnStop của dịch vụ của bạn. Những gì bạn làm với thông báo đó là tùy thuộc vào bạn. Lý tưởng nhất, bạn sẽ có một số cơ chế như việc sử dụng một CancellationToken để thông báo cho bất kỳ chủ đề của bạn hiện đang làm việc mà họ cần phải quấn nó lên và thoát ra càng nhanh càng tốt. Trong trường hợp của bạn, nó có thể liên quan đến việc đóng ServiceHost của bạn. Phương thức OnStop của bạn nên chờ cho đến khi nó biết rằng nó đã được thực hiện (bằng cách tham gia các chủ đề, ví dụ) trước khi trở về. Có nhiều cách để thông báo cho Service Control Manager rằng bạn cần nhiều thời gian hơn, hoặc chỉ để cho nó biết rằng bạn đã nhận được thông báo và bạn đang tích cực làm việc để dừng (SERVICE_STATUS dwcheckpoint).

Nếu bạn vừa trở lại ngay lập tức từ OnStop (hoặc không bận tâm triển khai nó), thì tôi nghĩ rằng tất cả các chuỗi dịch vụ của bạn sẽ bị buộc chấm dứt nhanh chóng. Tôi không biết chắc chắn, bởi vì tôi chưa bao giờ thử điều này. Tôi luôn triển khai OnStop và chỉ trở lại sau khi mọi thứ được dọn sạch. Nếu bạn thực hiện OnStop, nhưng mất một thời gian rất dài để quay trở lại mà không để cho Trình quản lý điều khiển dịch vụ biết rằng bạn đang làm việc trên nó, thì nó sẽ đợi một chút (20 giây để ngừng dịch vụ ... đó là cài đặt đăng ký), và sau đó chấm dứt chủ đề của bạn.

Điều cần làm là viết dịch vụ của bạn để khởi động nhanh, dừng nhanh, tạm dừng và tiếp tục nhanh chóng, v.v. Như bạn thấy từ mô tả ở trên, chính xác những gì xảy ra trong trường hợp của bạn, phụ thuộc hoàn toàn vào cách bạn dịch vụ đã được triển khai. Chỉ có bạn mới có thông tin "biết chắc chắn".

http://blogs.msdn.com/b/bclteam/archive/2009/02/19/in-depth-how-net-managed-services-interact-with-the-servicecontrolmanager-scm-kim-hamilton.aspx

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