2010-06-17 36 views

Trả lời

9

Bạn có thể sử dụng BackgroundWorker để thực hiện thao tác dài của mình để phản hồi sự kiện Service.Start.

Thật dễ dàng để thực hiện điều đó trong phương thức OnStart() của lớp học ServiceBase được cấp. Ngoài ra còn có good example on MSDN hợp lý.

protected override void OnStart(string[] args) 
{ 
    var worker = new BackgroundWorker(); 
    worker.DoWork += DoSomeLongOperation; 

    worker.RunWorkerAsync(); 
} 

private void DoSomeLongOperation(object sender, DoWorkEventArgs e) 
{ 
    // do your long operation... 
} 

Lưu ý rằng bạn cũng có thể đăng ký vào ProgressChangedRunWorkerCompleted sự kiện, để bạn có thể thông báo cho người quản lý kiểm soát dịch vụ về sự tiến bộ của bạn và khởi động thành công (hoặc thất bại).

1

Tôi cũng phải thực hiện điều này: Tôi sinh ra một chuỗi khi khởi động thực hiện tất cả khởi tạo của nó và đặt riêng 'isInitialized' thành true khi kết thúc. Dịch vụ thực hiện các hành động định kỳ (ví dụ, trên bộ hẹn giờ) và sẽ không bắt đầu các hành động đó nếu isInitialized không được đặt thành true.

1

Chúng tôi thường sử dụng bộ hẹn giờ đơn giản để đạt được chức năng này. Chúng ta sẽ thiết lập bộ đếm thời gian trong dịch vụ OnStartup, cho phép dịch vụ trả lời lại Service Control Manager và sau đó có bộ đếm thời gian khởi động quá trình sau vài giây. Quá trình đó có thể đi trong một chủ đề riêng biệt hoặc không phụ thuộc vào những gì cần phải được thực hiện. Bộ hẹn giờ có thể được sử dụng lại nếu quá trình này cần phải diễn ra đều đặn.

0

Cách pragmatical tốt nhất là tạo chuỗi làm việc.

Nói chung tồn tại một cách được tài liệu khác, mà tôi có thể giải thích về ví dụ về mã không được quản lý. Trong quá trình khởi tạo, một dịch vụ Windows có một thời gian nhỏ để thực hiện điều này. Lần này có thể thay đổi ở đâu đó trong registry. Nếu dịch vụ cần nhiều hơn nếu có thể gọi

SetServiceStatus với dwCurrentState=SERVICE_START_PENDING một số dwCheckPointdwWaitHint, của SERVICE_STATUS struct điền để dwWaitHint là Thời gian ước tính cần thiết cho một hoạt động khởi đầu chưa giải quyết trong mili giây. Trước khi khoảng thời gian đã chỉ định trôi qua, dịch vụ sẽ thực hiện cuộc gọi tiếp theo của nó tới hàm SetServiceStatus với giá trị tăng thêm dwCheckPoint hoặc thay đổi trong dwCurrentState. Xem mô tả của dwWaitHint trên http://msdn.microsoft.com/en-us/library/ms685996(VS.85).aspx.

1

Tôi cũng gặp sự cố này với Dịch vụ Windows. Tôi nghĩ rằng bạn phải giữ logic khởi tạo dưới 30 giây, nếu không Trình quản lý Dịch vụ Windows sẽ ngừng dịch vụ.

Điều tôi đã làm khá đơn giản. Tôi tạo ra một phương pháp mà tôi đặt tất cả các logic nặng cần thiết để được thực hiện và sau đó tôi tạo ra một bộ đếm thời gian mà sẽ đánh dấu sau 20 giây và thực hiện phương pháp đó. Vì vậy, dịch vụ sẽ bắt đầu, sau đó tạo bộ hẹn giờ, khởi tạo nó với khoảng thời gian là 20 giây và sau đó kết thúc quá trình khởi tạo. Sau 20 giây, bộ hẹn giờ sẽ đánh dấu và bắt đầu logic nghiệp vụ của ứng dụng. Tất nhiên bạn có thể chỉ định bất cứ khoảng thời gian nào bạn muốn.

Bạn nên khai báo bộ đếm thời gian như một tham số của lớp:

public partial class YourService: ServiceBase 
{ 
    System.Timers.Timer tmrOnStart; 

Sau đó khởi tạo bộ đếm thời gian trong phương pháp OnStart

protected override void OnStart(string[] args) 
{ 
    //set the interval to 20 seconds 
    tmrOnStart = new Timer(); 
    tmrOnStart.Interval = 20000; 
    tmrOnStart.Enabled = true; 
    tmrOnStart.AutoReset = false; 
    tmrOnStart.Elapsed += new ElapsedEventHandler(tmrOnStart_Elapsed); 
    tmrOnStart.Start(); 
} 

Khi bộ đếm thời gian sẽ kích hoạt các sự kiện đã qua, nó sẽ thực hiện phương pháp này:

void tmrOnStart_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    heavyBusinessLogicMethod(); 
} 

Và bạn sẽ phải đặt logic của mình trong heavyBusine Phương thức ssLogicMethod.

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