he desarrollado una cola productor-consumidor genérico que late por Monitor de la siguiente manera:hace Monitor.Wait Necesita sincronización?
la puesta en cola:
public void EnqueueTask(T task)
{
_workerQueue.Enqueue(task);
Monitor.Pulse(_locker);
}
la retirada de cola:
private T Dequeue()
{
T dequeueItem;
if (_workerQueue.Count > 0)
{
_workerQueue.TryDequeue(out dequeueItem);
if(dequeueItem!=null)
return dequeueItem;
}
while (_workerQueue.Count == 0)
{
Monitor.Wait(_locker);
}
_workerQueue.TryDequeue(out dequeueItem);
return dequeueItem;
}
la sección de espera produce el siguiente SynchronizationLockException: "se ha llamado al método de sincronización de objetos desde un bloque de código no sincronizado" ¿necesito sincronizarlo? por qué ? ¿Es mejor usar ManualResetEvents o la versión Slim de .NET 4.0?
¿Por qué lo prefieres? ¿Cómo sincronizarías el Monitor? ¿Solo un bloqueo en el objeto de armario utilizado para el Monitor? ¿el candado no agrega otro cambio de contexto que el ResetEvents no necesita? – user437631
@ user437631: Sí, solo una declaración de 'cerradura' normal está bien. Eso puede o no requerir un cambio de contexto adicional, y no creo que tenga ninguna evidencia de que ResetEvents no lo requiera. De hecho, como son objetos internos de CLR en lugar de objetos Win32 de proceso cruzado, los monitores son más livianos: espere que ResetEvents. –