2009-10-08 18 views
7

Estoy implementando un tiempo de espera en una operación asíncrona (una serie de IO de red), y no estoy seguro de cuál es la perspectiva "mejor" (desde una asignación/rendimiento): crear un EventWaitHandle y usando RegisterWaitForSingleObject, o simplemente creando un Timer y usando su Tick..Net Timeouts: WaitForSingleObject vs Timer

En mi caso específico, el EventWaitHandle es de creación lenta, pero obviamente tendría que crearse una instancia para usar WaitForSingleObject. Así que realmente esta es una pregunta sobre el costo del recurso de un WaitHandle + WaitForSingleObject vs a Timer. Ambos enfoques son tan fáciles de implementar.

He implementado ambos en varias ocasiones, así que entiendo el terreno, no estoy seguro de qué enfoque es 'mejor'.

Respuesta

3

Morgan Skinner de Microsoft seems to prefer RegisterWaitForSingleObject.

En lo que se refiere a las asignaciones, el reflector revela que RegisterWaitForSingleObject crear una instancia de un RegisteredWaitHandle, mientras que un temporizador crea una TimerBase interna, así como una clase llamada _TimerCallback. Uno podría continuar y comparar los tamaños de estas clases y demás, pero parece que tienen más dependencias, especialmente las no administradas (ambas usan funciones win32 subyacentes), así que realmente no puedo dar una respuesta directa.

En cuanto al identificador de espera pasado al RegisterWaitForSingleObject, tenga en cuenta que podría asignar un único Maunal/AutoResetEvent y pasarlo a todas las llamadas (ya que cuenta con el tiempo de espera, por lo que nunca lo señalizaría) .

En cuanto al rendimiento, tampoco estoy seguro. El ThreadPool usará un hilo de espera especial para cada 63 acciones registradas a través del RegisterWaitForSingleObject. Por el contrario, un temporizador utilizará un temporizador win32 subyacente. Ambos terminarán usando un hilo de trabajo ThreadPool para la ejecución real. ¿Cuál es mejor en qué escenarios? me pega .. así que me gustaría ir con Skinner en este caso :)

Véase también:

+0

El artículo de su blog es a buena comparación de los usos, pero no es una recomendación muy fuerte para favorecer a uno frente al otro. Y cuanto más lo pensaba, más no podía ver ninguna diferencia en términos de transiciones del kernel y demás. Todavía me gustaría saber si hubo alguna diferencia en los costos de las API de Win32 subyacentes, pero el 'peso' de la implementación de .NET parece ser la mejor respuesta que he encontrado también. – piers7

1

Ninguno es mejor. Se usa un temporizador para "meter" periódicamente el hilo para hacer algo. WaitForSingleObject espera en los controladores. El tiempo de espera está allí para que pueda usarlo para decidir dejar de esperar en lugar de quedar atrapado en un punto muerto. No se requiere el uso de un temporizador para interrumpir la espera para un solo objeto de un bloqueo si usa el tiempo de espera.

El costo del recurso es insignificante para ambos. No puedo decir qué enfoque debe usar porque depende en gran medida de la situación del código que tenga.

+2

No estoy de acuerdo. Es una pregunta directa: el costo de asignar un temporizador frente al costo de asignar un indicador de espera y un WaitForSingleObject. Ambos son recursos de SO. Uno debe costar más que el otro, independientemente de mi situación. Y mientras en este escenario estoy hablando de un temporizador "único", * ambos * pueden usarse para periódicamente 'insertar' tu código - puedes usar el indicador 'executeOnlyOnce' en RegisterWaitForSingleObject ... – piers7