Ho avuto il seguente codice nella mia applicazione per alcuni anni e non ho mai visto un problema da esso.Code e maniglie di attesa in C#
while ((PendingOrders.Count > 0) || (WaitHandle.WaitAny(CommandEventArr) != 1))
{
lock (PendingOrders)
{
if (PendingOrders.Count > 0)
{
fbo = PendingOrders.Dequeue();
}
else
{
fbo = null;
}
}
// Do Some Work if fbo is != null
}
Dove CommandEventArr è costituito dalla NewOrderEvent (un evento reset automatico) e l'ExitEvent (un evento di reset manuale).
Ma non sono sicuro se questo è thread-safe (presupponendo N thread di produzione che bloccano tutti la coda prima dell'eniviazione e un thread utente che esegue il codice sopra). Inoltre, possiamo supporre che la proprietà Queue.Count restituisca solo un valore Int32 dell'istanza dalla classe Queue (senza volatile o interbloccato o un blocco, ecc.).
Qual è il solito schema utilizzato con una coda e un AutoResetEvent per risolvere questo problema e fare ciò che sto cercando di fare con il codice sopra?
(Modificato per modificare leggermente la domanda dopo che è stato correttamente rilevato che Queue.Count poteva fare qualsiasi cosa e la sua implementazione specifica).
Sicuramente questo ciclo è incorporato in un certo tipo di ciclo esterno (in esecuzione) - non è per questo che funziona bene? –
No, nessun altro ciclo. C'è solo un thread che blocca la coda e annulla gli ordini e quindi imposta NewOrderEvent. –