Cách tốt nhất để thực hiện một số khởi tạo dài khi dịch vụ Windows khởi động (hoặc tiếp tục bị tạm dừng) mà không chặn Trình quản lý điều khiển dịch vụ là gì?Thực hiện khởi tạo dài trong Dịch vụ Windows
Trả lời
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 ProgressChanged
và RunWorkerCompleted
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).
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.
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.
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ố dwCheckPoint
và dwWaitHint
, 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.
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.
- 1. Cách chạy tác vụ khi dịch vụ windows khởi động?
- 2. Cách tạo Dịch vụ Windows Celery?
- 3. Chạy Android 'dịch vụ' dài
- 4. Thực hiện dịch vụ Wcf IntegratedWindowsAuthentication
- 5. Dịch vụ Windows sẽ không khởi động (Lỗi 1053)
- 6. Cách tạo dịch vụ windows từ java jar?
- 7. Dịch vụ WCF và Dịch vụ Windows
- 8. liferay-6.1 - Thực hiện dịch vụ riêng
- 9. Sử dụng Thread.Sleep() trong Dịch vụ Windows
- 10. Không thể thực hiện URL khi gọi dịch vụ WCF có xác thực Windows
- 11. Dịch vụ Windows w/FileSystemWatcher trong C#
- 12. Bắt đầu một dịch vụ windows và khởi động cmd
- 13. Tệp hàng loạt để khởi động lại dịch vụ. Windows
- 14. Nhiều dịch vụ Windows trong một exe
- 15. Khởi chạy Ứng dụng GUI từ Dịch vụ Windows - Cửa sổ không xuất hiện
- 16. Dịch vụ Windows sẽ không tự động khởi động sau khi khởi động lại
- 17. Dịch vụ Windows đa luồng trong MingW
- 18. Cách tạo dịch vụ Windows cho Mac OS X?
- 19. Cách tạo Dịch vụ nghe C# cho MSMQ dưới dạng dịch vụ Windows
- 20. Thay thế cho Dịch vụ Windows
- 21. Windows không thể bắt đầu dịch vụ
- 22. MSMQ hỗ trợ dịch vụ WCF được lưu trữ trong dịch vụ windows không thành công khi khởi động
- 23. Dịch vụ Windows - lấy thư mục hiện tại
- 24. Trình lập lịch biểu tác vụ Windows để thực hiện các tác vụ trong vài giây
- 25. Dịch vụ Phân tích Chỉ Xác thực Windows
- 26. Thực hiện gọi lại từ Dịch vụ đến Hoạt động
- 27. Ngôn ngữ dễ nhất để tạo dịch vụ Windows
- 28. Danh sách khởi tạo hàm tạo dài
- 29. Sử dụng dịch vụ MFC trong Windows?
- 30. Cách tạo dịch vụ Windows với các tham số?