Biên tập: Nguồn: dieucay555
Trong bài này mình sẽ hướng dẫn tạo 1 ứng dụng windows service đơn giản bằng C#.
Windows services cung cấp phương tiện cho application logic chạy liên tục trên máy tính của bạn, thông
thường là việc cung cấp điều khiển thiết bị hoặc các dịch vụ hệ điều hành. Windows services là hữu dụng
đối với các ứng dụng phía server mà ta muốn chúng phải luôn ở trạng thái sẵn sàng phục vụ các yêu cầu
từ client. Nói chung, nếu bạn có nhu cầu xây dựng một trình ứng dụng mà bản chất hoạt động của nó
mang tính “âm thầm làm việc” và không cần sự tương tác trực tiếp của người dùng, bạn có thể nghĩ ngay
đến việc tạo trình ứng dụng loại Windows Service.
Windows service là một ứng dụng chạy trên máy server hoặc workstation và cung cấp những chức năng
mà sự diễn tiến của nó không cần sự tương tác trực tiếp của người dùng. Windows services thường được
dùng để giám sát hoạt động hệ thống.
Một Windows service sẽ chạy trong tiến trình của riêng nó, không phụ thuộc người dùng hay các chương
trình khác đang chạy trên cùng máy tính. Windows services thường được cấu hình để tự động bắt đầu khi
nào máy tính khởi động. Không giống như đa phần các ứng dụng, Windows services chạy dưới nhận dạng
bảo mật của chính nó, thay vì dưới nhận dạng của đăng nhập người dùng hiện hành. Chúng có thể bắt đầu
chạy, ngay cả nếu không có người dùng (user) đăng nhập máy tính.
Khi mà bạn tạo một ứng dụng với mục tiêu ứng dụng này sẽ chạy như là một Windows service, bạn cần
phải lưu ý rằng nó không bao gồm bất kỳ các yếu tố giao tiếp người dùng như message boxes hay dialog
boxes. Một Windows service không có tính chất cung cấp một giao diện trực quan (visual interface) cho
người dùng.
Thông thường một Windows service sẽ báo cáo đặc thù các kết quả và thông báo lỗi của nó tới một sổ ghi
biến cố (event log). Tuy nhiên bạn cũng có thể kết hợp nó với Web Service để làm những việc “động trời”
hơn như là âm thầm chuyển thông tin từ máy mà nó đang được cài đặt đến một máy ở xa thông qua
đường truyền internet.
Để tạo 1 ứng dụng win service bằng C#, trong Visual Studio, chúng ta tạo 1 project mới, chọn loại project
là windows service, đặt tên là SimplyService. Ở đây, tôi sẽ tạo 1 service theo dõi quá trình sử đụng CPU,
kết quả sẽ lưu vào 1 file txt là logfile. Tên của service này là UsageMonitor.
Vì service là ứng dụng ko có giao diện nên chúng ta sẽ ko nhìn thấy cái form để design đâu nhé. Vào
toolbox kéo 1 cái Timer và PerformanceCounter.
Đặt interval cho timer1 là 1000, set thuộc tính Enabled=true.
Đặt các thuộc tính cho performanceCounter1 như trong hình :
Biên tập: Nguồn: dieucay555
Rename cái service1 thành UsageMonitor (sẽ là tên của service mình tạo ra)
Trích dẫn:
Các sự kiện của 1 service :
OnStart : Khởi phát khi service được khởi động.
OnPause : Nếu tính chất CanPauseAndContinue của service được đặt là true, service có thể được tạm dừng
và kích hoạt trở lại bởi người quản trị Windows.
OnContinue : Khởi phát khi service được kích hoạt trở lại.
OnStop : Khởi phát trước khi service ngưng hoạt động.
OnShutDown : Nếu tính chất CamShutDown được đặt là true, sự kiện này sẽ được khởi phát khi service
vẫn đang trong trạng thái chạy (running) và máy tính bị shutdown.
Bây giờ chúng ta sẽ viết các sự kiện cho service
Sự kiện timer1_Tick()
private void timer1_Tick(object sender, System.EventArgs e)
{
TextWriter file = new StreamWriter("C:\\logfile.txt", true);
file.WriteLine("CPU Usage : " + performanceCounter1.NextValue().ToString() +
System.DateTime.Now);
file.Close();
}
Sự kiện OnStart của service
protected override void OnStart(string[] args)
{
timer1.Enabled = false;
TextWriter file = new StreamWriter("C:\\logfile.txt", true);
Biên tập: Nguồn: dieucay555
file.WriteLine("Service Started");
file.Close();
timer1.Interval = 1000;
timer1.Enabled = true;
}
Sự kiện OnStop
protected override void OnStop()
{
timer1.Enabled = false;
TextWriter file = new StreamWriter("C:\\logfile.txt", true);
file.WriteLine("Service Restarted");
file.Close();
}
Và sự kiên OnContinue
protected override void OnContinue()
{
timer1.Enabled = false;
TextWriter file = new StreamWriter("C:\\logfile.txt", true);
file.WriteLine("Service stopped");
file.Close();
}
Tiếp đến, chúng ta sẽ add thêm 1 cái component là installservice vào để lát nữa cài đặt cho cái service của
mình.
Vào cửa sổ Design của service, chuột phải rồi chọn Add Installer
Sẽ có thêm thành phần serviceInstaller1 xuất hiện, đặt thuộc tính serviceName của nó là UsageMonitor.
Biên tập: Nguồn: dieucay555
Sau khi đã Build thành công project, khi chọn F5 để debug, sẽ có 1 thông báo xuất hiện, đại loại là nó yêu
cầu chúng ta sử dụng chuơng trình InstallUtil để đăng ký cái service của chúng ta với windows.
Cái chuơng trình InstallUtil.exe nằm trong C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 (ở đây là
mình sử dụng VS2k8,NetFrameWork 3.5,nếu các bạn sử dụng VS phiên bản khác thì có thể cái v2.0.50727
sẽ khác )
Copy cả cái InstallUtil.exe và cái SimplyService ( cái chúng ta tạo ra được khi F5 cái project windows
service SImplyService của chúng ta lúc nãy) vào chung 1 thư mục nào đó, ví dụ như vào thư mục service
và mình đăt luôn ngoài desktop.
Biên tập: Nguồn: dieucay555
Vào run, gõ cmd, rồi dùng lệnh cd để chuyển tới thư mục service của chúng ta (cd desktop\\service)
Tiếp đến gõ tiếp : InstallUtil.exe SimplyService.exe
Nếu ko có lỗi gì xảy ra thì hiện ra tiếp 1 cửa sổ login
Biên tập: Nguồn: dieucay555
Mình sẽ login với quyền admin nên chỗ user name mình sẽ nhập là :home-f40ccec89f\administrator , ko
tạo password ho service nên mình sẽ để trống phần đó.(home-f40ccec89f là tên máy của mình)
Nếu đăng ký thành công thì cái cửa sổ cmd sẽ hiện ra thông báo
Trích dẫn:
The Commit phase completed successfully.
The transacted install has completed.
Bây giờ chúng ta mở cái manager services lên (run->services.msc)
Chúng ta sẽ thấy cái UsageMonitor đã xuất hiện trong list services. Chuột phải vào UsageMonitor, chọn
thẻ Log on, rồi chọn cái Local System account, sau đấy apply rồi chọn start cái service đó.
Vào trong ổ C,sẽ thấy 1 cái file txt là logfile được tao ra
Muốn gỡ bỏ cái service vừa đăng ký với windows, chúng ta lại vào cmd rồi chuyển vào thư mục service lúc
nãy. gõ lệnh : InstallUtil/u SimplyService.exe
Vì service chỉ được chạy khi đã đăng ký trong windows, nên ko thể debug cho project windows service như
những project thông thường.
Chúng ta có thể debug như sau :
Đặt một điểm Break Point trong hàm xử lý sự kiện Tick của timer1.
Vào menu Debug, chọn Attach Process, rồi chọn SimplyService.exe và attach
Biên tập: Nguồn: dieucay555
Lúc này, service sẽ được chạy và dừng lại ở điểm Break Point đã đặt ở trên, tiến hành chạy từng bước
service để debug như cách thông thường