Pergunta

Esta questão sobre temporizadores para serviços do Windows me fez pensar :

Say tenho (e eu) um windows isso é serviço de espera em um WaitHandle e, quando acordou, ele mergulha em uma spin-espera como se eu tivesse mostrado abaixo em um fluxograma

espera rotação diagrama http://www.86th.org/waitspin.jpg

Estou curioso, se usando um timer seria melhor do que um ciclo-spin espera (às vezes chamado de um spin-wait). Eu vou ser honesto, eu nunca usei temporizadores para outra coisa senão o meu próprio mexer.

Eu não tenho quaisquer planos para mudar a menos que as diferenças são profundas e os benefícios de usar um temporizador são surpreendentes. No entanto, estou muito interessado em povos pensamentos sobre um contra o outro para o desenvolvimento futuro deste projecto.

Deixe-me saber se isso deve ser um wiki

Foi útil?

Solução

Eu não vê-lo recebendo qualquer benefício com um temporizador. Você é essencialmente comportando como um temporizador de qualquer maneira com a sua chamada sono, e você não está sendo um porco largura de banda desde rendimentos dormir até a fatia de tempo. Ter um temporizador explícita acordar e chamar você está indo só para complicar o código.

Eu realmente não dizer que você está fazendo um spin-espera, desde que eu geralmente pensam de um spin-espera como algo que não dorme. Ele só queima tudo o que do processador tempo de espera para o sinal de movimento.

Outras dicas

Sleeping um fio e à espera de uma alça com um tempo limite são basicamente a mesma coisa debaixo das cobertas. Eu acho que os temporizadores são essencialmente implementado usando sono, por isso não há muita diferença lá, também. Em outras palavras, você pode simplificar o seu código pela espera no punho com um tempo limite em um único loop e verificar para ver porque a espera foi lançado (dados disponíveis ou timeout), em vez de implementar circuitos de espera e dormir separadas. Ligeiramente mais eficiente do que laços independentes.

O ideal seria não usar sono em tudo e simplesmente dependem do código de dados de geração em corretamente aumentar o evento seu código consumo está esperando, com um tempo limite longish de lidar quando a origem do evento foi embora.

Se os dados forem externo, como em um soquete ou outro dispositivo de entrada, em seguida, a alça geralmente pode ser configurado para permitir à espera de dados para se tornar disponível - sem necessidade de sondagem, nesse caso, uma vez que o evento será sempre sinalizado quando dados estão prontos para o consumo.

Nós usamos tópicos. Não só eles executar como um timer, mas eles nos dão um identificador para realizar outras operações enquanto o segmento é dormir.

Eu acho que ele realmente depende de sua exigência:

  1. Executar a tarefa todas 5 min (por exemplo, 12:00, 00:05, 00:10, ...)
  2. Ao completar a tarefa atual, execute a próxima tarefa após 5 min.

Contador parece ser fácil para o caso 1 e Thread.Sleep parece ser fácil para o caso 2, apesar de temporizador e Thread.Sleep pode fazer ambos.

I, na verdade, colocar um comentário mais longo (incluindo algumas considerações sobre o caso 1) para uma pergunta semelhante ( Windows serviço programado execução ).

Polling é ruim, e quase sempre evitável. Ocasionalmente para coisas triviais é menos ruim do que a complexidade necessária para evitá-lo.

Que fonte é você pesquisa para "Tem de dados?" que você não pode se transformar em uma espécie de espera pega?

Além disso, não Sleep() em código graves (como um serviço) para qualquer quantidade de tempo significativo. A única bloqueando você pode fazer é WaitFor[Single|Multiple]Objects(...) onde a lista de alças inclui um evento que é disparado quando é hora de encerrar o processo. Encontre todos os lugares que você está chamando Sleep(millisec) e substituí-lo com WaitForSingleObjects(g_shutdownEvent, millisec).

Como Raymond Chen explica, "Sim, qualquer coisa." Se você não consegue descobrir uma maneira de obter notificado quando os seus dados está pronto -. então o seu SOL

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top