Erro: O evento decorrido da classe System.Timers.Timer não é aumentado em um serviço do Windows

Traduções deste artigo Traduções deste artigo
ID do artigo: 842793 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sintomas

Você pode usar o Microsoft .NET Framework para criar um novo Microsoft Windows service que contém um objeto System.Timers.Timer . Quando você executar este novo Windows service, o evento decorrido da classe System.Timers.Timer não pode ser elevado.

Causa

Observação Nesta seção, o objeto System.Timers.Timer é conhecido como o objeto de Timer .

No caso de manipulador para o evento decorrido do Timer de objeto, se você chamar o método Stop do objeto Timer , a referência ao objeto Timer é perdida. O coletor de lixo, em seguida, recupera a memória que está associada ao objeto Timer . Mais tarde, mesmo se você chamar o Iniciar método do objeto Timer para disparar o evento decorrido , a chamada não funciona. O evento decorrido não é disparado.

Como Contornar

Para contornar este problema, adquira o hotfix no seguinte artigo da Base de dados de Conhecimento Microsoft:
900822CORRECÇÃO: Quando um aplicativo com base do .NET Framework usa a classe System.Threading.Timer, o evento timer pode não ser sinalizado no .NET Framework 1.1 S900822
Além disso, use um objeto System.Threading.Timer em vez do objeto System.Timers.Timer .

Situação

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

Mais Informações

Etapas para reproduzir o comportamento

  1. Inicie o Microsoft Visual Studio NET..
  2. Usar o Microsoft Visual Basic .NET para criar um serviço do Windows projeto é denominado WinServ1. Por padrão, o arquivo Service1.vb é criado.
  3. No Solution Explorer, renomeie Service1.vb como SimpleService.vb.
  4. Abra o modo de exibição código do arquivo SimpleService.vb.
  5. Substitua o código existente com o código a seguir:
    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 Exibir , clique em Janela de propriedades para exibir a janela Propriedades para o SimpleService.vb serviço.
  8. Alterne para o modo de exibição design da SimpleService.vb serviço.
  9. Na parte inferior da janela Properties, clique no link Add Installer para adicionar o arquivo ProjectInstaller.vb ao seu projeto. Por padrão, o objeto ServiceProcessInstaller1 e o objeto ServiceInstaller1 são criados.
  10. Na janela Properties para o objeto ServiceInstaller1, defina a propriedade StartType para automático .
  11. Na janela Properties para ServiceProcessInstaller1 objeto, defina a propriedade conta como LocalSystem .
  12. No Solution Explorer, clique o projeto WinServ1 com o botão direito do mouse e, em seguida, clique em Propriedades . A caixa de diálogo WinServ1 Property Pages é exibida.
  13. Na caixa objeto de inicialização , selecione Sub Main e, em seguida, clique em OK .
  14. No menu Build , clique em Build Solution para criar o arquivo WinServ1.exe.
  15. Instale o serviço Windows que você criou. Para fazer isso, execute o seguinte comando no prompt de comando Visual Studio. NET:
    InstallUtil Path \WinServ1.exe
    Observação Path é um espaço reservado para o caminho de arquivo absoluto do arquivo WinServ1.exe que você criou na etapa 14.
  16. Reinicie o computador.

    O serviço WinServ1 começa a executar e grava informações no log do aplicativo do Visualizador de eventos a cada segundo. Você logo perceberá que o serviço WinServ1 não gravar informações para o log de aplicativo. Esse comportamento indica que o evento decorrido não está sendo gerado.

Referências

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

Introdução a timers baseados em servidor
http://msdn2.microsoft.com/en-us/library/tb9yt5e6(vs.71).aspx

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

Aplicativos Windows Service
http://msdn2.microsoft.com/en-us/library/aa984074(VS.71).aspx

Propriedades

ID do 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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes 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

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com