Windows服务

时间:2010-08-10 09:40:21

标签: vb.net .net-3.5 windows-services

我正在尝试在.NET 3.5中编写一个小型Windows服务,如果你是“C:\ demofolder”中的新文件,每隔10美元检查一次,然后发送电子邮件。到目前为止,我在下面的代码中已经到了这里,然后在Public Sub New()

中出现错误
Imports System
Imports System.Timers
Imports System.ServiceProcess
Public Class TestMyService

    '  A timer that controls how frequenty the example writes to the
    '  event log.
    Private serviceTimer As Timer

    Public Sub New()

        '  Set the ServiceBase.ServiceName property.
        ServiceName = "TestMyService Service"

        '  Configure the level of control available on the service.
        CanStop = True
        CanPauseAndContinue = True
        CanHandleSessionChangeEvent = True

        '  Configure the service to log important events to the
        '  Application event log automatically.
        AutoLog = True

    End Sub

    Protected Overrides Sub OnStart(ByVal args() As String)
        ' Add code here to start your service. This method should set things
        ' in motion so your service can do its work.
    End Sub

    Protected Overrides Sub OnStop()
        ' Add code here to perform any tear-down necessary to stop your service.
    End Sub

Public Shared Sub Main()

    '  Create an instance of the TestMyService class that will write
    '  an entry to the Application event log.  Pass the object to the
    '  shared ServiceBase.Run method.
    ServiceBase.Run(New TestMyService)

End Sub


End Class

我收到以下错误消息:

  在'mcWinService.TestMyService'中多次声明

Sub Main':mcWinService.TestMyService.Main(),mcWinService.TestMyService.Main()

     

Public Shared Sub Main()'具有多个具有相同签名的定义。

     

设计器生成的类型'mcWinService.TestMyService'中的Public Sub New()'应该调用InitializeComponent方法。

2 个答案:

答案 0 :(得分:6)

尝试移动

  来自Public Shared Sub Main()

ServiceBase.Run(New TestMyService)

  

受保护的覆盖Sub OnStart

然后删除Public Shared Sub Main()

此外,删除Public Sub New(),因为您可以从“Property Windows”中设置这些属性。 F7从代码切换到设计师视图。

  

更新1:文件夹监视器的Windows服务示例

Imports System.Net.Mail
Imports System.Net
Imports System.Timers
Imports System.IO

Public Class DemoFolderMonitor

    Private Shared timer As System.Timers.Timer
    Private Shared timerInterval As Integer

    Protected Overrides Sub OnStart(ByVal args() As String)
        ' Add code here to start your service. This method should set things
        ' in motion so your service can do its work.

        '  Use the EventLog object automatically configured by the
        '  ServiceBase class to write to the event log.
        'EventLog.WriteEntry(String.Format("DemoFolderMonitor Service starting."))

        ' Set the Interval  (1sec = 1000 milliseconds).
        timerInterval = 2000
        timer = New System.Timers.Timer(timerInterval)
        EventLog.WriteEntry("DemoFolderMonitor Service starting.")

        ' Hook up the Elapsed event for the timer.
        AddHandler timer.Elapsed, AddressOf WatchFolder

        timer.Interval = timerInterval
        timer.Enabled = True

    End Sub

    Protected Overrides Sub OnStop()
        ' Add code here to perform any tear-down necessary to stop your service.
        EventLog.WriteEntry("DemoFolderMonitor Service stopping...")

    End Sub

    Protected Sub WatchFolder()

        Dim watcher As New FileSystemWatcher
        watcher.Path = "C:\Demo\"

        watcher.NotifyFilter = (NotifyFilters.LastAccess Or NotifyFilters.LastWrite Or NotifyFilters.FileName Or NotifyFilters.DirectoryName)

        'watch all file types.
        watcher.Filter = "*.*"
        ' Add event handlers.
        AddHandler watcher.Changed, AddressOf OnChanged
        AddHandler watcher.Created, AddressOf OnChanged
        AddHandler watcher.Deleted, AddressOf OnChanged
        AddHandler watcher.Renamed, AddressOf OnRenamed

        ' Begin watching.
        watcher.EnableRaisingEvents = True

    End Sub

    'Define the event handlers.
    Private Shared Sub OnChanged(ByVal source As Object, ByVal e As FileSystemEventArgs)
        ' Specify what is done when a file is changed, created, or deleted.
        Dim changeLog = "File: " & e.FullPath & " " & " | Action: " & e.ChangeType.ToString
        WriteChangeLog(changeLog)

    End Sub

    Private Shared Sub OnRenamed(ByVal source As Object, ByVal e As RenamedEventArgs)
        ' Specify what is done when a file is renamed.
        Dim changeLog = "File" & e.OldFullPath & " " & "renamed to" & " " & e.FullPath
        WriteChangeLog(changeLog)

    End Sub

    'Custom action. You can either send an e-mail or write change to local file
    'In this example I write change to local file
    Private Shared Sub WriteChangeLog(ByVal changeLog As String)

        'Create a text file and write the change log to the text file
        Dim filename As String = DateTime.Now.ToString("hh-mm-ss") & ".txt"
        Dim writer As StreamWriter
        writer = File.CreateText("C:\ChangeLog\" & filename)
        writer.WriteLine("Datetime Log  at {0} Log Message: {1}", DateTime.Now.ToString("MMM-dd-yyyy @ hh:mm:ss tt"), changeLog)
        writer.Close()

    End Sub

End Class

进一步相关阅读检查:

振作!

答案 1 :(得分:2)

听起来你在另一个项目文件中有另一个Main方法。在项目范围内搜索单词Main并查看是否可以找到它。

您还可以通过进入项目的属性对话框并选择TestMyService作为启动对象而不是Sub Main来修复该错误。