Erro: Não é aumentado o evento decorrido da classe System.timers.Timer in um serviço do Windows

Artigo: 842793 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Pode utilizar o Microsoft .NET Framework para criar um novo Microsoft Windows serviço que contém um objecto System.timers.Timer . Quando executa este Windows novo serviço, o evento decorrido da classe System.timers.Timer não pode ser aumentado.

Causa

Nota Nesta secção, o objecto System.timers.Timer é referido como o objecto temporizador .

No caso de processador para o evento decorrido de temporizador do objecto, se chamar o método Stop do objecto temporizador , a referência ao objecto temporizador é perdida. O recolector de lixo, em seguida, recupera a memória associada ao objecto de temporizador . Mais tarde, mesmo se chamar Iniciar método do objecto temporizador para accionar o evento decorrido , a chamada não funciona. O evento decorrido não é accionado.

Como contornar

Para contornar este problema, obtenha a correcção no seguinte artigo da base de dados de conhecimento da Microsoft:
900822CORRECÇÃO: Quando uma aplicação do .NET Framework com utiliza a classe System.Threading.Timer, o evento de temporizador poderá não ser assinalado no S900822 do .NET Framework 1.1
Além disso, utilize um objecto System.Threading.Timer em vez do objecto System.timers.Timer .

Ponto Da Situação

A Microsoft confirmou que este é um erro no Microsoft produtos listados na secção "Aplica-se a".

Mais Informação

Passos para reproduzir o comportamento

  1. Inicie o Microsoft Visual Studio NET..
  2. Utilizar o Microsoft Visual Basic .NET para criar um serviço do Windows projecto chama WinServ1. Por predefinição, é criado o ficheiro Service1.VB.
  3. No Solution Explorer, mude service1.VB SimpleService.vb.
  4. Abra a vista de código do ficheiro SimpleService.vb.
  5. Substitua o código existente com o seguinte código:
    Imports System
    Imports System.ServiceProcess
    Imports System.Diagnostics
    Imports System.Timers
    
    Public Class SimpleService : Inherits ServiceBase
    
        Protected tmrMain As Timer
    
        Public Shared Sub Main()
            ServiceBase.Run(New SimpleService)
        End Sub
    
        Public Sub New()
            MyBase.New()
            CanPauseAndContinue = True
            ServiceName = "WinServ1"
            tmrMain = New Timer
        End Sub
    
        Protected Overrides Sub OnStart(ByVal args() As String)
            EventLog.WriteEntry("WinServ1 started")
            AddHandler tmrMain.Elapsed, AddressOf tmrMain_Elapsed
            AddHandler tmrMain.Disposed, AddressOf tmrMain_Disposed
            tmrMain.Interval = 1000
            ' Start raising the Elapsed event.
            tmrMain.Enabled = True
        End Sub
    
        Protected Sub tmrMain_Elapsed(ByVal source As Object, ByVal e As ElapsedEventArgs)
            EventLog.WriteEntry("WinServ1")
            ' Stop raising the Elapsed event.
            tmrMain.Stop()
            ' Force garbage collection to make sure that the garbage collector
            ' reclaims the memory that is associated with the tmrMain Timer object.
            GC.Collect()
            ' Start to raise the Elapsed event again.
            tmrMain.Start()
        End Sub
        Protected Sub tmrMain_Disposed(ByVal source As Object, ByVal e As EventArgs)
            EventLog.WriteEntry("WinServ1 timer disposed")
        End Sub
    
    End Class
  6. No Solution Explorer, clique em SimpleService.vb .
  7. No menu Ver , clique em Janela de propriedades a apresentar a janela Propriedades para o SimpleService.vb serviço.
  8. À vista de estrutura do SimpleService.vb serviço.
  9. Na parte inferior da janela Propriedades, clique na hiperligação Adicionar o programa de instalação para adicionar o ficheiro ProjectInstaller.vb ao projecto. Por predefinição, o objecto ServiceProcessInstaller1 e o objecto ServiceInstaller1 são criados.
  10. Na janela Propriedades para o objecto ServiceInstaller1, defina a propriedade StartType para automático .
  11. Na janela Propriedades para ServiceProcessInstaller1 de objecto, defina a propriedade conta como sistema local .
  12. No Solution Explorer, clique com o botão direito do rato no projecto WinServ1 e, em seguida, clique em Propriedades . A caixa de diálogo WinServ1 páginas de propriedades é apresentada.
  13. Na caixa objecto de arranque , seleccione Sub Main e, em seguida, clique em OK .
  14. No menu criar , clique em criar soluções para criar o ficheiro WinServ1.exe.
  15. Instale o serviço Windows que criou. Para efectuar este procedimento, execute o seguinte comando numa linha de comandos do Visual Studio. NET:
    InstallUtil Path \WinServ1.exe
    Nota Path é um marcador para o caminho de ficheiro absoluto do ficheiro WinServ1.exe que criou no passo 14.
  16. Reinicie o computador.

    O serviço WinServ1 começa a executar e, em seguida, escreve informações no registo de aplicações do Visualizador de eventos cada segundo. Poderá notar logo que o serviço WinServ1 não escreve informações no registo de aplicações. Este comportamento indica que não é a ser aumentado o evento de decorrido .

Referências

Para obter informações adicionais, visite os seguintes Web sites da Microsoft Developer Network (MSDN):
Forçar uma recolha de lixo
http://msdn2.microsoft.com/en-us/library/s5zscb2d(vs.71).aspx

Introdução ao temporizadores baseada no servidor
http://msdn2.microsoft.com/en-us/library/tb9yt5e6(vs.71).aspx

Classe de temporizador
http://msdn2.microsoft.com/en-us/library/system.timers.timer(vs.71).aspx

Aplicações de serviço do Windows
http://msdn2.microsoft.com/en-us/library/aa984074(VS.71).aspx

Propriedades

Artigo: 842793 - Última revisão: sexta-feira, 18 de Maio de 2007 - Revisão: 1.7
A informação contida neste artigo aplica-se a:
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0
Palavras-chave: 
kbmt kbtshoot kbbug kbsample kbcode kbserviceprocess kbtimer KB842793 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 842793

Submeter comentários