Ho un precedente question che ho fornito la mia soluzione; tuttavia, non ho accesso a ConcurrentQueue<T>
da quando sono su .Net 3.5. Ho bisogno di Queue<T>
per consentire la concorrenza. Ho letto questo question e sembra presentare un problema se un articolo è non nella coda e il metodo filettato tenta di desquare un elemento.Abilitazione coda <T> con concomitanza
Il mio compito ora è determinare se posso derivare la mia classe di coda concorrente. Questo è ciò che mi si avvicinò con:
public sealed class ConcurrentQueue : Queue<DataTable>
{
public event EventHandler<TableQueuedEventArgs> TableQueued;
private ICollection que;
new public void Enqueue(DataTable Table)
{
lock (que.SyncRoot)
{
base.Enqueue(Table);
}
OnTableQueued(new TableQueuedEventArgs(Dequeue()));
}
// this is where I think I will have a problem...
new public DataTable Dequeue()
{
DataTable table;
lock (que.SyncRoot)
{
table = base.Dequeue();
}
return table;
}
public void OnTableQueued(TableQueuedEventArgs table)
{
EventHandler<TableQueuedEventArgs> handler = TableQueued;
if (handler != null)
{
handler(this, table);
}
}
}
Così, quando un DataTable è in coda, i EventArgs passerà un tavolo accodamento al sottoscrittore dell'evento. Questa implementazione mi fornirà una coda thread-safe?
'que' è _utilmente_ inutile. Dovresti bloccare un oggetto chiave 'readonly = new object();'. – SLaks
@SLaks: ho implementato 'ICollection que' e' lock (que.SyncRoot) 'basato su MSDN: http://msdn.microsoft.com/en-us/library/bb344892.aspx – IAbstract
Non ne hai bisogno a tutti. 'SyncRoot' è utile se hai pezzi di codice disgiunti che devono essere bloccati per la stessa collezione. Nel tuo caso, 'que' è' null'. Hai solo bisogno di bloccare un singolo oggetto nei tuoi metodi. – SLaks