665
Chương 17: Sự hòa hợp với môi trường Windows
OnStart
Tất cả các dịch vụ đều phải hỗ trợ phương thức
OnStart
, SCM gọi
phương thức này để khởi động dịch vụ. SCM truyền cho dịch vụ một
mảng kiểu chuỗi chứa các đối số cần thiết. Nếu
OnStart
không trả về
trong 30 giây thì SCM sẽ không chạy dịch vụ.
OnStop
Được SCM gọi để dừng một dịch vụ—SCM chỉ gọi
OnStop
nếu thuộc
tính
CanStop
là
true
.
OnPause
Được SCM gọi để tạm dừng một dịch vụ—SCM chỉ gọi
OnPause
nếu
thuộc tính
CanPauseAndContinue
là
true
.
OnContinue
Được SCM gọi để tiếp tục một dịch vụ bị tạm dừng—SCM chỉ gọi
OnContinue
nếu thuộc tính
CanPauseAndContinue
là
true
.
OnShutdown
Được SCM gọi khi hệ thống đang tắt—SCM chỉ gọi
OnShutDown
nếu
thuộc tính
CanShutdown
là
true
.
OnPowerEvent
Được SCM gọi khi trạng thái nguồn mức-hệ-thống thay đổi, chẳng
hạn một laptop chuyển sang chế độ suspend. SCM chỉ gọi
OnPowerEvent
nếu thuộc tính
CanHandlePowerEvent
là
true
.
OnCustomCommand
Cho phép mở rộng cơ chế điều khiển dịch vụ với các thông điệp điều
khiển tùy biến; xem chi tiết trong tài liệu .NET Framework SDK.
Như được đề cập trong bảng 17.5, phương thức
OnStart
phải trả về trong vòng 30 giây, do đó
bạn không nên sử dụng
OnStart
để thực hiện các thao tác khởi động tốn nhiều thời gian. Một
lớp dịch vụ nên hiện thực một phương thức khởi dựng để thực hiện các thao tác khởi động,
bao gồm việc cấu hình các thuộc tính thừa kế từ lớp
ServiceBase
. Ngoài các thuộc tính khai
báo các thông điệp điều khiển nào được dịch vụ hỗ trợ, lớp
ServiceBase
còn hiện thực ba
thuộc tính quan trọng khác:
•
ServiceName
—Là tên được SCM sử dụng để nhận dạng dịch vụ, và phải được thiết lập
trước khi dịch vụ chạy.
•
AutoLog
—Điều khiển việc dịch vụ có tự động ghi vào nhật ký sự kiện hay không khi
nhận thông điệp điều khiển
OnStart
,
OnStop
,
OnPause
, và
OnContinue
.
•
EventLog
—Trả về một đối tượng
EventLog
được cấu hình trước với tên nguồn sự kiện
(event source) trùng với thuộc tính
ServiceName
được đăng ký với nhật ký Application
(xem mục 17.3 để có thêm thông tin về lớp
EventLog
).
Bước cuối cùng trong việc tạo một dịch vụ là hiện thực phương thức tĩnh
Main
. Phương thức
này phải tạo một thể hiện của lớp dịch vụ và truyền nó cho phương thức tĩnh
ServiceBase.Run
. Nếu muốn chạy nhiều dịch vụ trong một tiến trình, bạn phải tạo một mảng
các đối tượng
ServiceBase
và truyền nó cho phương thức
ServiceBase.Run
. Mặc dù các lớp
dịch vụ đều có phương thức
Main
nhưng bạn không thể thực thi mã lệnh dịch vụ một cách trực
tiếp; bạn sẽ nhận được hộp thông báo như hình 17.2 nếu trực tiếp chạy một lớp dịch vụ. Mục
17.6 sẽ trình bày cách cài đặt dịch vụ trước khi thực thi.