Domanda

Questa domanda Timer per Windows Services mi ha fatto pensare :

Dire che ho (e faccio) un servizio di questo è finestre in attesa di una WaitHandle e quando svegliato, si tuffa in un attendista girare come ho mostrato di seguito in un diagramma di flusso

aspettare schema di spin http://www.86th.org/waitspin.jpg

Sono curioso di sapere se si utilizza un timer sarebbe meglio di un aspettare-spin ciclo (a volte chiamato uno spin-wait). Sarò onesto, non ho mai usato timer per altro che il mio armeggiare.

Non ho in programma di passare a meno che le differenze sono profonde e i vantaggi di utilizzare un timer sono sorprendenti. Tuttavia, sono molto interessato sui popoli pensieri su uno contro l'altro per il futuro sviluppo di questo progetto.

Vorrei sapere se questo dovrebbe essere un wiki

È stato utile?

Soluzione

Non vedo ottenere alcun beneficio da un timer. Si sono essenzialmente comportarsi come un timer in ogni caso con la chiamata sonno, e non si sta comportando un maiale di larghezza di banda in quanto il sonno produce l'intervallo di tempo. Avere un risveglio timer esplicito e chiamarti è solo andare a complicare il codice.

Non vorrei davvero dire che si sta facendo uno spin-attesa, dal momento che in genere penso di uno spin-wait come qualcosa che non dorme. E 'solo brucia tutto ciò che di tempo del processore in attesa del segnale di andare.

Altri suggerimenti

Dormire un filo e in attesa su una maniglia con un timeout sono fondamentalmente la stessa cosa sotto le coperte. Direi che i timer sono essenzialmente implementati utilizzando il sonno, in modo da non molta differenza nemmeno lì. In altre parole, si potrebbe semplificare il codice aspettando sulla maniglia con un timeout in un unico ciclo e controllo per vedere il motivo per cui l'attesa è stato rilasciato (dati disponibili o timeout), piuttosto che di esecuzione distinta di attesa e di sonno loop. Un po 'più efficiente di loop indipendenti.

Idealmente, non userebbe il sonno a tutti e semplicemente dipendono dal codice dati generazione per sollevare correttamente il caso in cui il codice di consumo è in attesa su, con un timeout piuttosto lungo da gestire quando l'origine evento è andato via.

Se i dati sono esterni, come ad esempio su un socket o altro dispositivo di immissione, quindi la maniglia può generalmente essere impostato per consentire attesa di dati diventano disponibili - nessuna necessità di polling in tale caso, in quanto l'evento sarà sempre segnalata quando i dati sono pronti per il consumo.

Usiamo le discussioni. Non solo essi svolgono come un timer, ma ci danno una maniglia per eseguire altre operazioni mentre il thread sta dormendo.

Credo che in realtà dipende il vostro requisito:

  1. Eseguire l'attività di tutti 5 min (ad esempio, 12:00, 00:05, 00:10, ...)
  2. Dopo aver completato l'attività corrente, eseguire l'operazione successiva dopo 5 min.

Timer sembra essere facile per il caso 1 e Thread.Sleep sembra essere facile per il caso 2, anche se timer e Thread.Sleep possono fare entrambi.

I, infatti, messo un commento più lungo (tra cui qualche considerazione sul caso 1) per una domanda simile ( di Windows servizio di linea esecuzione ).

Polling è male, e quasi sempre evitabili. Di tanto in tanto per cose banali è meno male che la complessità necessaria per evitare di esso.

Quali fonte sei polling per "contiene dati?" che non si può trasformare in una sorta di manico aspettare?

Inoltre, non Sleep() nel codice gravi (come un servizio) per qualsiasi quantità di tempo significativo. L'unico blocco che puoi fare è WaitFor[Single|Multiple]Objects(...) dove la lista delle maniglie include un evento che viene attivato quando è il momento di chiudere il processo. Trova ovunque si sta chiamando Sleep(millisec) e sostituirlo con WaitForSingleObjects(g_shutdownEvent, millisec).

Come spiega Raymond Chen, "Sì, qualsiasi cosa." Se non è possibile trovare un modo per ottenere notificato , quando i dati sono pronti -. allora il vostro SOL

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top