2015-05-02 13 views
5

Tôi có một dịch vụ Windows để sinh ra một tập hợp các hoạt động con trên các chủ đề riêng biệt và chỉ nên chấm dứt khi tất cả các hoạt động đó đã hoàn tất thành công. Tôi không biết trước phải mất bao lâu để chấm dứt hoạt động sau khi nhận được tín hiệu dừng. Trong OnStop(), tôi đợi trong khoảng thời gian cho tín hiệu dừng đó và tiếp tục yêu cầu thêm thời gian miễn là hệ thống sẵn sàng cấp nó.Chi phí an toàn cho RequestAdditionalTime() là gì?

Dưới đây là cấu trúc cơ bản:

class MyService : ServiceBase 
{ 
    private CancellationTokenSource stopAllActivities; 
    private CountdownEvent runningActivities; 

    protected override void OnStart(string[] args) 
    { 
     // ... start a set of activities that signal runningActivities 
     //  when they stop 
     // ... initialize runningActivities to the number of activities 
    } 

    protected override void OnStop() 
    { 
     stopAllActivities.Cancel(); 

     while (!runningActivities.Wait(10000)) 
     { 
      RequestAdditionalTime(15000); // NOTE: 5000 added for overhead 
     } 
    } 
} 

Chỉ cần bao nhiêu "overhead" tôi nên có thêm trong RequestAdditionalTime cuộc gọi? Tôi lo ngại rằng các yêu cầu được tích lũy, thay vì dựa vào thời điểm khi mỗi cuộc gọi RequestAdditionalTime được thực hiện. Nếu trường hợp đó xảy ra, việc thêm phí trên có thể khiến hệ thống từ chối yêu cầu vì nó quá xa trong tương lai. Nhưng nếu tôi không thêm bất kỳ chi phí nào thì dịch vụ của tôi có thể bị chấm dứt trước khi nó có cơ hội yêu cầu khối tiếp theo của thời gian bổ sung.

Trả lời

5

This post là không chính xác đáng khích lệ:

Các tài liệu MSDN không đề cập đến điều này, nhưng có vẻ như giá trị quy định tại RequestAdditionalTime không phải là thực sự ‘thêm’ thời gian. Thay vào đó, nó thay thế giá trị trong ServicesPipeTimeout. Tệ hơn nữa, bất kỳ giá trị nào lớn hơn hai phút (120000 mili giây) sẽ bị bỏ qua, tức là khoảng hai phút.

Tôi hy vọng đó không phải là trường hợp, nhưng tôi đang đăng câu trả lời này là trường hợp xấu nhất.

CẬP NHẬT: Tác giả của bài đăng đó đủ tốt để đăng trả lời rất chi tiết cho nhận xét của tôi, mà tôi đã sao chép dưới đây.

Lars, câu trả lời ngắn gọn là không.

Điều tôi muốn nói là bây giờ tôi nhận ra rằng Windows Services nên được thiết kế để bắt đầu và chấm dứt xử lý nhanh chóng khi được yêu cầu làm như vậy.

Là nhà phát triển, chúng tôi có xu hướng tập trung vào việc triển khai xử lý và sau đó gói nó lên và phân phối dưới dạng Dịch vụ Windows.

Tuy nhiên, đây thực sự không phải là cách tiếp cận chính xác để thiết kế Dịch vụ Windows. Dịch vụ phải có khả năng phản hồi nhanh chóng các yêu cầu khởi động và dừng không chỉ khi quản trị viên đưa ra yêu cầu từ bảng điều khiển dịch vụ mà còn khi hệ điều hành yêu cầu bắt đầu như là một phần của quá trình xử lý bắt đầu hoặc ngừng bởi vì nó đang tắt ,

Hãy xem điều gì sẽ xảy ra khi Windows được định cấu hình để tắt khi UPS báo hiệu rằng nguồn đã bị lỗi. Không thích hợp cho dịch vụ trả lời “Tôi cần thêm vài phút nữa…”.

Có thể viết các dịch vụ phản ứng nhanh để dừng yêu cầu ngay cả khi chúng triển khai các tác vụ xử lý đang chạy dài. Thông thường, một quá trình chạy dài sẽ bao gồm xử lý hàng loạt dữ liệu và quá trình xử lý sẽ kiểm tra xem một điểm dừng đã được yêu cầu ở cấp đơn vị nhỏ nhất của công việc để đảm bảo tính nhất quán của dữ liệu hay không.

Ví dụ: dịch vụ đầu tiên tôi tìm thấy thời gian chờ dừng là một vấn đề liên quan đến việc xử lý hàng đợi thông báo trên máy chủ từ xa.Quá trình xử lý đã lấy ra một thông báo từ hàng đợi, gọi một dịch vụ web để lấy dữ liệu liên quan đến chủ đề của thông báo, và sau đó viết một tệp dữ liệu để xử lý bởi một ứng dụng khác.

Tôi đã triển khai xử lý dưới dạng cuộc gọi định thời gian cho một phương thức. Khi phương thức được gọi là phương thức không trả lại cho đến khi tất cả các thông báo trong hàng đợi đã được xử lý. Tôi nhận ra đây là một sai lầm đối với một Dịch vụ Windows vì đôi khi có thể có hàng chục nghìn thông báo trong hàng đợi và quá trình xử lý có thể mất vài phút.

Phương pháp có khả năng xử lý 50 thông báo mỗi giây. Vì vậy, những gì tôi nên làm là thực hiện một kiểm tra để xem một điểm dừng đã được yêu cầu trước khi xử lý mỗi thông báo. Điều này sẽ cho phép phương thức trả lại khi nó đã hoàn tất việc xử lý thông báo nhưng trước khi nó bắt đầu xử lý thông báo tiếp theo. Điều này sẽ đảm bảo rằng dịch vụ đáp ứng nhanh chóng với yêu cầu ngừng và mọi thông báo đang chờ xử lý vẫn được xếp hàng đợi để xử lý khi dịch vụ được khởi động lại.

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