Własna usługa w .NET

Published: January 15, 2003 | Updated: February 28, 2005

Download
Download Wlasna usluga w.doc
876 KB
Microsoft Word file

Wstęp

Jednym z typów projektów w Visual Studio .NET jest Windows Service (znowu – jak każdy inny typ projektu można go tworzyć w dowolnym z języków .NET). W poniższym artykule przedstawiony został przykład serwisu, który będzie monitoruje folder C:\Watch i w momencie, gdy w danym folderze pojawi się nowy plik (o odpowiednim rozszerzeniu), dokonuje konwersji polskich znaków standardu win-1250 na ISO.

Omawiany przykład wymaga do działania systemu Windows NT/2000/XP. Tylko w tej rodzinie systemów możliwe jest tworzenie serwisów i tylko tam j Warto też pamiętać, że serwis musi mieć odpowiednie praw – w tym oczywiście prawa zapisu do konkretnego dysku

Po utworzeniu nowego projektu (załóżmy, że serwis ma nazwę CPConvertService), Vs.NET wygeneruje następujący szkielet (pokazane są tylko istotne fragmenty):

Imports System.ServiceProcess

Public Class CPConvertService
    Inherits System.ServiceProcess.ServiceBase
    Dim m_watch As CPConvertDLL.clsWatcher

#Region " Component Designer generated code "
[...]
    'Inny schemat wątkowania
     _
    Shared Sub Main()
        Dim ServicesToRun() As System.ServiceProcess.ServiceBase
        ' Można uruchamiać więcej niż jeden serwis. Na przykład:
        ' ServicesToRun = New System.ServiceProcess.ServiceBase ()
        {New Service1, New MySecondUserService}
        '
    ServicesToRun = New System.ServiceProcess.ServiceBase()
    {New CPConvertService()}

    System.ServiceProcess.ServiceBase.Run(ServicesToRun)
    End Sub

[...]
#End Region

    Protected Overrides Sub OnStart(ByVal args() As String)
        ' Tu uruchamiana jest usługa
        ' 
    System.Diagnostics.EventLog.WriteEntry("CPConvertService",
    "CPConvertService - uruchamiane")
    m_watch = New CPConvertDLL.clsWatcher()
    System.Diagnostics.EventLog.WriteEntry("CPConvertService",
    "CPConvertService - uruchamione")
    End Sub

    Protected Overrides Sub OnStop()
        ' Usługa zatrzymana
        m_watch = Nothing
        System.Diagnostics.EventLog.WriteEntry("CPConvertService",
        "CPConvertService - zatrzymane")
    End Sub

    Protected Overrides Sub OnPause()
        ' Pauza
        m_watch.WPause()
        System.Diagnostics.EventLog.WriteEntry("CPConvertService",
        "CPConvertService - pauza")
    End Sub

    Protected Overrides Sub OnContinue()
        ' Wznowienie usługi
        m_watch.WResume()
        System.Diagnostics.EventLog.WriteEntry("CPConvertService",
        "CPConvertService - wznowienie")
    End Sub
End Class

Właściwa realizacja usługi znajduje się w innej przestrzeni nazw (CPConvertDLL), w klasie .clsWatcher. W przykładzie na CD jest to oddzielny projekt dołączony do rozwiązania. W tym przypadku klasa została umieszczona w oddzielnym pliku DLL –można z niej skorzystać także w innym projekcie – np. normalnej aplikacji konsolowej. Dzięki temu możliwe jest znacznie prostsze śledzenie właściwej funkcjonalności.

Robert Nutrycz

Ciąg dalszy artykułu w dokumencie do pobrania (Plik *.doc 876 KB) (8 stron)