Bắt đầu với một csharp-example và hợp lệ ghi nhận liên quan SO câu hỏi (Restart a windows services from C# và Cannot restart a Service) và các câu hỏi khác nhau liên quan đến khởi động lại chỉ là một dịch vụ, tôi đang tự hỏi những gì các phương pháp tốt nhất là cho khởi động lại một dịch vụ với các dịch vụ phụ thuộc (ví dụ: Message Queuing
, trên đó Message Queuing Triggers
phụ thuộc hoặc IIS
, trên đó FTP Publishing
và World Wide Web Publishing
phụ thuộc). Các mmc snap-in hiện này automagically, nhưng mã dường như không cung cấp các chức năng tương tự (ít nhất là không dễ dàng).Khởi động lại dịch vụ với các dịch vụ phụ thuộc?
MSDN documentation for Stop nói "Nếu bất kỳ dịch vụ nào phụ thuộc vào dịch vụ này cho hoạt động của họ, chúng sẽ bị ngừng trước khi dịch vụ này bị dừng. Thuộc tính DependentServices chứa tập hợp dịch vụ phụ thuộc vào dịch vụ này" và DependentServices
trả về một loạt dịch vụ . Giả sử StartService()
và StopService()
theo các công ước nêu trong các ví dụ và ví dụ tham chiếu ở trên (ngoại trừ việc họ chấp nhận ServiceControllers
và TimeSpans
trực tiếp), tôi bắt đầu với:
public static void RestartServiceWithDependents(ServiceController service, TimeSpan timeout)
{
ServiceController[] dependentServices = service.DependentServices;
RestartService(service, timeout); // will stop dependent services, see note below* about timeout...
foreach (ServiceController dependentService in dependentServices)
{
StartService(dependentService, timeout);
}
}
Nhưng nếu sự phụ thuộc dịch vụ được lồng nhau (đệ quy) hoặc theo chu kỳ (nếu đó là thậm chí có thể ...) - nếu Service A
là phụ thuộc vào bởi Service B1
và Service B2
và Service C1
phụ thuộc vàoService B1
, có vẻ như 'khởi động lại' Service A
bằng phương pháp này sẽ dừng lại Service C1
nhưng sẽ không khởi động lại nó ...
Để làm ví dụ này hình ảnh rõ ràng hơn, tôi sẽ làm theo các mô hình trong mmc dịch vụ snap-in:
The following system components depend on [Service A]:
- Service B1
- Service C1
- Service B2
Có cách nào tốt hơn để đi về điều này, hoặc nó sẽ chỉ phải đệ quy bước vào và ngừng mỗi dịch vụ phụ thuộc và sau đó khởi động lại tất cả sau khi nó khởi động lại dịch vụ chính?
Ngoài ra, sẽ phụ thuộc nhưng hiện đang dừng các dịch vụ được liệt kê trong Dịch vụ phụ thuộc? Nếu vậy, điều này sẽ không khởi động lại chúng dù sao? Nếu vậy, chúng ta có nên kiểm soát điều đó không? Điều này dường như trở nên lộn xộn và phức tạp hơn ...
* Lưu ý: Tôi nhận thấy rằng timeout
không được áp dụng chính xác ở đây (thời gian chờ tổng thể có thể dài hơn nhiều lần so với dự kiến), nhưng hiện tại không phải là vấn đề Tôi quan tâm - nếu bạn muốn sửa chữa nó, tốt, nhưng không chỉ nói 'thời gian chờ bị hỏng ...'
Cập nhật: Sau khi kiểm tra sơ bộ, tôi đã phát hiện (/ xác nhận) các hành vi sau:
- Dừng dịch vụ (ví dụ:
Service A
) các dịch vụ khác (e .g.Service B1
) phụ thuộc vào sẽ ngừng các dịch vụ khác (kể cả phụ thuộc "lồng" nhưService C1
) DependentServices
không bao gồm dịch vụ phụ thuộc vào tất cả các nước (Chạy, Ngưng, vv), và nó cũng bao gồm phụ thuộc lồng nhau, ví dụ:Service_A.DependentServices
sẽ chứa{Service B1, Service C1, Service B2}
(theo thứ tự đó, nhưC1
phụ thuộc vàoB1
).- Bắt đầu dịch vụ phụ thuộc vào những dịch vụ khác (ví dụ:
Service B1
phụ thuộc vàoService A
) cũng sẽ bắt đầu các dịch vụ cần thiết.
Đoạn mã trên do đó có thể được đơn giản hóa (ít nhất là một phần) để chỉ dừng dịch vụ chính (mà sẽ ngừng tất cả các dịch vụ phụ thuộc) và sau đó khởi động lại dịch vụ hầu hết phụ thuộc (ví dụ Service C1
và Service B2
) (hoặc chỉ cần khởi động lại "tất cả" các dịch vụ phụ thuộc - nó sẽ bỏ qua những dịch vụ đã bắt đầu), nhưng điều đó thực sự chỉ ngăn cản sự khởi đầu của dịch vụ chính trong giây lát cho đến khi một trong những phụ thuộc phàn nàn về nó, vì vậy điều đó không thực sự hữu ích.
Trông bây giờ như chỉ khởi động lại tất cả các phụ thuộc là cách đơn giản nhất, nhưng mà bỏ qua (bây giờ) quản lý dịch vụ mà đã dừng lại và như vậy ...
Nhận xét "trạng thái trước đó của họ là pres erved trong bộ sưu tập "không hợp lệ. Trạng thái dường như được cập nhật khi tôi thực thi mã này. Vì vậy, tôi đã phải sửa đổi nó để ghi lại tình trạng ban đầu trước khi khởi động lại dịch vụ chính. Có thể triển khai nội bộ .NET đã thay đổi kể từ khi bài đăng này được đăng? – Stif