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

Một phần của tài liệu CÁC GIẢI PHÁP LẬP TRÌNH C - TS. NGUYỄN XUÂN THỦY - 9 docx (Trang 25 - 28)

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 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.

Hình 17.2 Hộp thông báo Windows Service Start Failure

Lớp ServiceExample trong ví dụ dưới đây sử dụng một System.Timers.Timer để ghi một entry vào nhật ký sự kiện Windows theo định kỳ. vào nhật ký sự kiện Windows theo định kỳ.

using System; using System.Timers;

using System.ServiceProcess;

public class ServiceExample : ServiceBase {

// Timer điều khiển khi nào ServiceExample ghi vào nhật ký sự kiện. private System.Timers.Timer timer;

public ServiceExample() {

// Thiết lập thuộc tính ServiceBase.ServiceName. ServiceName = "ServiceExample";

// Cấu hình các thông điệp điều khiển. CanStop = true;

CanPauseAndContinue = true;

// Cấu hình việc ghi các sự kiện quan trọng vào // nhật ký Application.

AutoLog = true; }

// Phương thức sẽ được thực thi khi Timer hết // hiệu lực — ghi một entry vào nhật ký Application.

private void WriteLogEntry(object sender, ElapsedEventArgs e) {

EventLog.WriteEntry("ServiceExample active : " + e.SignalTime); }

protected override void OnStart(string[] args) { // Lấy chu kỳ ghi sự kiện từ đối số thứ nhất. // Mặc định là 5000 mili-giây,

// và tối thiểu là 1000 mili-giây. double interval;

try {

interval = System.Double.Parse(args[0]); interval = Math.Max(1000, interval); } catch {

interval = 5000; }

EventLog.WriteEntry(String.Format("ServiceExample starting. " + "Writing log entries every {0} milliseconds...", interval)); // Tạo, cấu hình, và khởi động một System.Timers.Timer

// để gọi phương thức WriteLogEntry theo định kỳ.

// Các phương thức Start và Stop của lớp System.Timers.Timer // giúp thực hiện các chức năng khởi động, tạm dừng, tiếp tục, // và dừng dịch vụ.

timer = new Timer(); timer.Interval = interval; timer.AutoReset = true;

timer.Elapsed += new ElapsedEventHandler(WriteLogEntry); timer.Start();

}

protected override void OnStop() {

EventLog.WriteEntry("ServiceExample stopping..."); timer.Stop();

timer.Dispose(); timer = null; }

protected override void OnPause() {

if (timer != null) {

EventLog.WriteEntry("ServiceExample pausing..."); timer.Stop();

} }

protected override void OnContinue() {

if (timer != null) {

EventLog.WriteEntry("ServiceExample resuming..."); timer.Start();

} }

public static void Main() {

// Tạo một thể hiện của lớp ServiceExample để ghi một // entry vào nhật ký Application. Truyền đối tượng này // cho phương thức tĩnh ServiceBase.Run.

ServiceBase.Run(new ServiceExample()); }

}

6.

Một phần của tài liệu CÁC GIẢI PHÁP LẬP TRÌNH C - TS. NGUYỄN XUÂN THỦY - 9 docx (Trang 25 - 28)

Tải bản đầy đủ (PDF)

(66 trang)