2009-08-10 33 views
7

Tôi đã viết một dịch vụ cửa sổ và một gui cho nó. Tất nhiên gui chủ yếu phụ thuộc vào dịch vụ. Có cách nào để gui chờ dịch vụ không? Đôi khi tôi cần phải tải lại cấu hình dịch vụ từ gui và khởi động lại dịch vụ.Làm cách nào để GUI chờ dịch vụ windows?

Tôi đã suy nghĩ về 2 giải pháp: 1. sử dụng thời gian và giấc ngủ để chờ đợi cho tình trạng điều khiển dịch vụ để thay đổi (tất nhiên là giải pháp đơn giản nhất: P) 2. implementin INotifiPropertyChanged giao diện ở đâu đó (điều này có vẻ phức tạp đối với tầm thường này vấn đề).

Tôi đã tự hỏi có cách nào thanh lịch hơn để làm điều đó không? Có một sự kiện mà tôi đang thiếu ở đâu đó không?

Trả lời

8

ServiceController có một phương pháp WaitForStatus nơi bạn vượt qua nó một đối số kiểu ServiceControllerStatus. Bạn có thể sử dụng nó như sau:

controller.WaitForStatus(ServiceControllerStatus.Running); 
+0

chỉ rắc rối với nó là nó cho bạn biết khi dịch vụ đang chạy, không phải khi dịch vụ đã khởi tạo chính nó và sẵn sàng làm những thứ bạn muốn. Nó có thể là đủ cho OP, nó có thể không. – gbjbaanb

+0

Tôi không chắc chắn, nhưng tôi nghĩ trạng thái là ServiceControllerStatus.Running khi dịch vụ IS được khởi tạo hoàn toàn (sau khi phương thức OnStart đã được gọi). Trước đó, đó là ServiceControllerStatus.StartPending. –

+2

Đây chính xác là những gì tôi cần. Xin lỗi vì không nhận thấy phương pháp này. Bên cạnh đó tôi say rượu với nhiều caffe tôi đang tìm kiếm một sự kiện: P (xấu của tôi). Giống như bổ sung cho trường hợp - Tôi cần sử dụng phương thức Refresh() để cập nhật dữ liệu dịch vụ. Nếu không nó cho thấy nó chạy ngay cả sau khi Stop() (nhưng nó có thể được kết nối với các cửa sổ 7 tôi đang sử dụng). – kyrisu

1

Sử dụng kernel Event object. Khi bạn khởi động cả hai ứng dụng, hãy để chúng tạo hoặc mở một đối tượng Event có tên, sau đó đợi nó. Người kia có thể báo hiệu nó, lật trạng thái, do đó cho phép ứng dụng kia ngừng chờ và chạy.

+2

lol Tôi nghĩ rằng bạn MIS liên kết mà url –

+0

Đó là một màn hình plasma thật sự tốt đẹp mặc dù. :-) –

+0

hrmph. Nhưng tôi * muốn * plasma đó rất nhiều :) Cố định liên kết, cổ vũ. – gbjbaanb

1

Tôi có thể sẽ tạo ra một đoạn riêng biệt để thăm dò ý kiến ​​đơn giản và xem trạng thái bộ điều khiển dịch vụ của bạn đã thay đổi khi thay đổi xảy ra tiêu diệt chuỗi này. Sau đó chỉ cần tái đẻ trứng thread khi bạn cần phải bắt đầu lại cuộc thăm dò

darknight

1

Sử dụng EventWaitHandle. GUI của bạn có thể đợi trên WaitHandle và dịch vụ sẽ thiết lập nó sẽ kích hoạt GUI để tiếp tục với những gì nó đã làm trước khi nó bắt đầu chờ đợi. Không bỏ phiếu, không lặp, không lộn xộn.

This great article on C# threading có lẽ là một nguồn lực tốt hơn để biết về WaitHandles

0
ServiceController mysqlServiceController = new ServiceController(); 
mysqlServiceController.ServiceName = "MySql"; 
var timeout = 3000; 

myServiceController.Start(); 

try 
{ 
    //Wait till the service runs mysql  
    ServiceController.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Running, new TimeSpan(0, timeout, 0)); 
} 
catch (System.ServiceProcess.TimeoutException) 
{ 
    MessageBox.Show(string.Format("Starting the service \"{0}\" has reached to a timeout of ({1}) minutes, please check the service.", mysqlServiceController.ServiceName, timeout)); 
} 
Các vấn đề liên quan