2010-09-15 39 views
6

Tôi là người mới bắt đầu hoàn chỉnh để làm việc với các dịch vụ windows. Tôi có một bộ xương cơ bản đã hoạt động cho dịch vụ và tôi hiện đang thực hiện việc này:Làm thế nào để chạy một exe từ dịch vụ windows và ngừng dịch vụ khi quá trình exe thoát?

protected override void OnStart(string[] args) 
    { 
     base.OnStart(args); 
     Process.Start(@"someProcess.exe"); 
    } 

chỉ để khởi động chương trình khi bắt đầu chương trình.

Tuy nhiên, tôi muốn dịch vụ tự dừng khi quá trình bắt đầu từ lần thoát exe. Tôi khá chắc chắn tôi cần phải làm một số loại luồng (một cái gì đó tôi cũng là người mới bắt đầu), nhưng tôi không chắc chắn về phác thảo tổng thể về cách thức hoạt động này, cũng không phải cách cụ thể để ngăn chặn một quá trình từ bên trong . Bạn có thể giúp tôi với quy trình chung cho điều này (tức là bắt đầu một chuỗi từ OnStart, sau đó là ...?)? Cảm ơn.

Trả lời

9

Bạn có thể sử dụng BackgroundWorker cho luồng, sử dụng Process.WaitForExit() để chờ quá trình chấm dứt cho đến khi bạn ngừng dịch vụ của mình.

Bạn nói đúng rằng bạn nên thực hiện một số luồng, thực hiện nhiều công việc trong OnStart có thể hiển thị lỗi về việc không khởi động chính xác từ Windows khi khởi động dịch vụ.

protected override void OnStart(string[] args) 
{ 

    BackgroundWorker bw = new BackgroundWorker(); 
    bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
    bw.RunWorkerAsync(); 
} 

private void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    Process p = new Process(); 
    p.StartInfo = new ProcessStartInfo("file.exe"); 
    p.Start(); 
    p.WaitForExit(); 
    base.Stop(); 
} 

Sửa Bạn cũng có thể muốn chuyển Process p cho một thành viên lớp và ngăn chặn quá trình này trong OnStop để đảm bảo rằng bạn có thể dừng dịch vụ một lần nữa nếu exe đi haywire.

protected override void OnStop() 
{ 
    p.Kill(); 
} 
+0

Cảm ơn, điều này làm việc khá nhiều chính xác như tôi hy vọng. – xdumaine

1

someProcess.exe nên có someLogic để dừng dịch vụ gọi điện thoại;)

Sử dụng các lớp ServiceController.

// Toggle the Telnet service - 
// If it is started (running, paused, etc), stop the service. 
// If it is stopped, start the service. 
ServiceController sc = new ServiceController("Telnet"); 
Console.WriteLine("The Telnet service status is currently set to {0}", 
        sc.Status.ToString()); 

if ((sc.Status.Equals(ServiceControllerStatus.Stopped)) || 
    (sc.Status.Equals(ServiceControllerStatus.StopPending))) 
{ 
    // Start the service if the current status is stopped. 

    Console.WriteLine("Starting the Telnet service..."); 
    sc.Start(); 
} 
else 
{ 
    // Stop the service if its status is not set to "Stopped". 

    Console.WriteLine("Stopping the Telnet service..."); 
    sc.Stop(); 
} 

// Refresh and display the current service status. 
sc.Refresh(); 
Console.WriteLine("The Telnet service status is now set to {0}.", 
        sc.Status.ToString()); 

Mã từ trang được liên kết ở trên.

+0

Cảm ơn, điều này có vẻ như nó sẽ đạt được kết quả cuối cùng - nếu tôi đang phát triển exe. Chẳng phải đây không phải là giải pháp thay vì giải pháp sao? Và nó sẽ chỉ làm việc giả sử tôi đang viết .exe. Giả sử tôi không có quyền truy cập vào nguồn cho exe và điều này vẫn có thể thực hiện được thông qua dịch vụ windows. – xdumaine

2

Bạn phải sử dụng ServiceController để làm điều đó, nó có phương thức Stop. Đảm bảo dịch vụ của bạn có thuộc tính CanStop được đặt thành true.

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