2009-10-08 14 views
7

Sto implementando un timeout su un'operazione asincrona (una serie di IO di rete), e non sono sicuro di quale sia la prospettiva 'migliore' (da una allocazione/prestazioni): creare un EventWaitHandle e utilizza RegisterWaitForSingleObject, o semplicemente creando un Timer e usando il suo Tick.. Timeout Net: WaitForSingleObject vs Timer

Nel mio caso specifico, EventWaitHandle è creato in modo pigro, ma ovviamente dovrebbe essere istanziato per utilizzare WaitForSingleObject. Quindi questa è davvero una domanda sul costo delle risorse di WaitHandle + WaitForSingleObject vs un Timer. Entrambi gli approcci sono facili da implementare.

Ho implementato entrambi in vari momenti, quindi comprendo il terreno, non sono sicuro di quale approccio sia "migliore".

risposta

3

Morgan Skinner di Microsoft seems to prefer RegisterWaitForSingleObject.

quanto riguarda le assegnazioni sono interessati, riflettore rivela che RegisterWaitForSingleObject creare un'istanza di un RegisteredWaitHandle, mentre un timer interno crea un TimerBase, così come una classe denominata _TimerCallback. Si potrebbe andare avanti e confrontare le dimensioni di queste classi e così via, ma sembrano avere più dipendenze, specialmente quelle non gestite (entrambe usano le funzioni di win32 sottostanti) - quindi non posso davvero dare una risposta diretta.

Per quanto riguarda la maniglia di attesa passato a RegisterWaitForSingleObject però, tenere a mente che si potrebbe allocare un singolo Maunal/AutoResetEvent e passare che a tutte le chiamate (dato che si sta contando sul timeout, in modo che non avevo mai segnalarlo comunque) .

Per quanto riguarda le prestazioni, non sono nemmeno sicuro. ThreadPool utilizzerà un thread di attesa speciale per ogni 63 azioni registrate tramite RegisterWaitForSingleObject. Al contrario, un timer utilizzerà un timer win32 sottostante. Entrambi finiranno per utilizzare un thread di lavoro ThreadPool per l'esecuzione effettiva. Quale è meglio in quali scenari? mi batte .. così mi piacerebbe andare con Skinner su questo :)

Vedi anche:

+0

Il suo blog è un buon confronto degli usi, ma non è una raccomandazione molto forte per favorire l'uno contro l'altro. E più ci pensavo, più non vedevo alcuna differenza in termini di transizioni del kernel e così via. Mi piacerebbe ancora sapere se c'è una differenza di costo per le API di Win32 sottostanti, ma il "peso" dell'implementazione .net sembra la risposta migliore che ho trovato anch'io. – piers7

1

Nessuno è migliore. Un timer viene utilizzato periodicamente per "colpire" il thread per fare qualcosa. WaitForSingleObject attende sugli handle. Il timeout è lì, quindi puoi usarlo per decidere di smettere di aspettare, invece di rimanere bloccato nella situazione di stallo. L'uso di un timer per interrompere l'attesa di un oggetto da un blocco non è necessario se si utilizza il timeout.

Il costo delle risorse è trascurabile per entrambi. Non posso dire quale approccio si dovrebbe usare perché è altamente dipendente dalla situazione del codice che si ha.

+2

non sono d'accordo. È una domanda semplice: costo di allocazione di un timer rispetto al costo di allocazione di un waithandle e WaitForSingleObject. Sono entrambe le risorse del sistema operativo. Uno deve costare più dell'altro, indipendentemente dalla mia situazione. E mentre in questo scenario sto parlando di un timer 'one off', * entrambi * possono essere usati periodicamente per "colpire" il tuo codice - puoi usare il flag 'executeOnlyOnce' su RegisterWaitForSingleObject ... – piers7