Ultimamente, tenho verificado alguns dos possíveis temporizadores System.Threading.Timer
e System.Timers.Timer
são os que me parecem mais necessários (já que eles oferecem suporte ao pool de threads).
Estou fazendo um jogo e planejo usar todos os tipos de eventos, com intervalos diferentes, etc.
Qual seria o melhor?
Threading.Timer
's artigo MSDN , é perfeitamente thread-safe ...System.Threading.Timer
é "ironicamente" não seguro paraSystem.Threading.Thread
threads e os threads obtidos através do pool. Só porque essas classes não seguram sua mão e gerenciam o uso dalock
palavra-chave em si, não significa que essas classes não sejam seguras. Você também pode dizer queSystem.Threading.Thread
não é seguro para threads, porque é exatamente tão verdadeiro.SynchronizingObject
não faz o próprio objeto temporizador thread-safe. Apenas garante que o seu código para manipular o evento do timer seja chamado em um thread específico (se você definir essa propriedade adequadamente). O próprio objeto timer não garante a segurança de threads, conforme claramente indicado na documentação. Por outro lado, oSystem.Threading.Timer
objeto é documentado especificamente como seguro para threads.System.Threading.Timer
é um cronômetro simples. Ele chama você de volta em um thread do conjunto de threads (do pool de trabalho).System.Timers.Timer
é umSystem.ComponentModel.Component
que envolve aeSystem.Threading.Timer
fornece alguns recursos adicionais usados para despachar em um encadeamento específico.System.Windows.Forms.Timer
em vez disso, agrupa um HWND somente mensagem nativo e usa Temporizadores de Janela para gerar eventos nesse loop de mensagem HWNDs.Se o seu aplicativo não tiver uma interface do usuário e você desejar o temporizador .Net mais leve e de uso geral possível (porque você está feliz em descobrir seu próprio encadeamento / envio), então
System.Threading.Timer
é o melhor possível na estrutura.Não estou totalmente claro com o que os supostos problemas "não são seguros para tópicos"
System.Threading.Timer
. Talvez seja exatamente o mesmo feito nesta pergunta: Segurança de thread de System.Timers.Timer vs System.Threading.Timer , ou talvez todo mundo apenas queira dizer:é fácil escrever condições de corrida quando você usa temporizadores. Por exemplo, veja esta pergunta: Segurança de encadeamento do temporizador (System.Threading)
re-entrada de notificações de timer, em que seu evento de timer pode ser acionado e retornar uma segunda vez antes de terminar o processamento do primeiro evento. Por exemplo, veja esta pergunta: Execução segura de threads usando System.Threading.Timer e Monitor
fonte
System.Timers.Timer
usa umSystem.Threading.Timer
internamente. Veja o código fonte .Em seu livro " CLR Via C # ", Jeff Ritcher desencoraja o uso
System.Timers.Timer
, a partir desse timerSystem.ComponentModel.Component
, permitindo que ele seja usado na superfície de design do Visual Studio. Para que seja útil apenas se você quiser um cronômetro em uma superfície de design.Ele prefere usar
System.Threading.Timer
para tarefas em segundo plano em um thread do conjunto de threads.fonte
System.Threading.Timer
é semelhante a usar um pool de threads ou criar seu próprio thread. É claro que essas classes não tratam da sincronização para você - esse é o seu trabalho! Nem um segmento de pool de encadeamentos, seu próprio encadeamento nem um retorno de chamada do temporizador manipularão o bloqueio - em qual objeto, de que maneira e em que circunstâncias você precisa bloquear exige um bom julgamento, e a versão de encadeamento do temporizador oferece mais flexibilidade e granularidade.Informações da Microsoft sobre isso (consulte Comentários no MSDN ):
É interessante mencionar que
System.Timers.Timer
foi preterido no .NET Core 1.0, mas foi implementado novamente no .NET Core 2.0 (/ .NET Standard 2.0). O objetivo do .NET Standard 2.0 era que fosse o mais fácil possível alternar do .NET Framework, provavelmente o motivo pelo qual ele voltou.Quando foi preterido, o Suplemento do Visual Studio do .NET Portability Analyzer recomendou o uso
System.Threading.Timer
.Parece que a Microsoft prefere
System.Threading.Timer
antesSystem.Timers.Timer
.NOTA DE EDIÇÃO 2018-11-15: entrego para alterar minha resposta, pois as informações antigas sobre o .NET Core 1.0 não eram mais válidas.
fonte
Uma diferença importante não mencionada acima, que pode surpreendê-lo, é que
System.Timers.Timer
silenciosamente engole exceções, enquantoSystem.Threading.Timer
que não.Por exemplo:
vs
fonte
Encontrei uma pequena comparação no MSDN
fonte
As duas classes são funcionalmente equivalentes, exceto que
System.Timers.Timer
tem uma opção para chamar todos os retornos de chamada de expiração do timer através do ISynchronizeInvoke , definindo SynchronizingObject . Caso contrário, os dois timers invocam retornos de chamada de expiração nos threads do conjunto de threads.Quando você arrasta um
System.Timers.Timer
para uma superfície de design do Windows Forms, o Visual Studio define SynchronizingObject para o objeto de formulário, o que faz com que todos os retornos de chamada de expiração sejam chamados no thread da interface do usuário.fonte
Do MSDN:
System.Threading.Timer
é um timer simples e leve que usa métodos de retorno de chamada e é atendido por threads do pool de threads. Não é recomendado para uso com o Windows Forms, porque seus retornos de chamada não ocorrem no thread da interface do usuário.System.Windows.Forms.Timer
é uma escolha melhor para uso com o Windows Forms. Para a funcionalidade de timer baseado em servidor, você pode considerar o usoSystem.Timers.Timer
, o que gera eventos e possui recursos adicionais.Fonte
fonte