2009-03-16 21 views
19

Tôi có dịch vụ cửa sổ quét mỗi thư mục sau mỗi giây để thay đổi. Tôi nhận được "dịch vụ không trả lời lệnh khởi động một cách kịp thời" khi cố gắng khởi động nó.Dịch vụ Windows: Vòng lặp OnStart - tôi có cần ủy quyền không?

Tôi đã có một vòng lặp thiết lập ra trong OnStart như vậy:

public void OnStart(string[] args) 
{ 
    while (!_shouldExit) 
    { 
     //Do Stuff 

     //Repeat 
     Thread.Sleep(_scanIntervalMillis); 
    } 
} 

Đây có phải là những gì đang gây ra lỗi? Tôi có nên ủy quyền phương pháp này không?

Trả lời

39

Khởi động chỉ nên bắt đầu công việc; nó không chịu trách nhiệm cho việc đó. Điều này thường có nghĩa là sinh ra một luồng mới để thực hiện công việc thực tế. Dự kiến ​​OnStart sẽ hoàn thành kịp thời. Ví dụ:

public void OnStart(string[] args) // should this be override? 
    { 
     var worker = new Thread(DoWork); 
     worker.Name = "MyWorker"; 
     worker.IsBackground = false; 
     worker.Start(); 
    } 
    void DoWork() 
    { 
     // do long-running stuff 
    } 
+0

Điều gì sẽ xảy ra với chuỗi khi dịch vụ bị chấm dứt? – JSideris

+0

@Bizorke nếu bạn có nghĩa là chấm dứt đột ngột: nó chỉ đơn giản là giết chết giữa dòng chảy, giống như chấm dứt bất kỳ quá trình. Nếu bạn có nghĩa là "dừng lại", sau đó: bất cứ điều gì mã của bạn cho nó làm –

+0

@MarcGravell Có một cụ thể mà worke.IsBackground là sai? do đó, thread là một sợi tiền cảnh? – Thomas

6

Phương pháp OnStart không được chặn. Bạn cần phải sinh ra một chuỗi công nhân sẽ thực hiện công việc. Bạn cũng có thể xem lớp FileSystemWatcher để quét các thông báo thay đổi hệ thống tập tin.

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