Sto cercando di capire quale sarà il modo migliore di lavorare con una coda. Ho un processo che restituisce un DataTable. Ogni DataTable, a sua volta, viene unito al precedente DataTable. C'è un problema, troppi record da conservare fino al BulkCopy finale (OutOfMemory).Come eseguire il threading con ConcurrentQueue <T>
Quindi, ho determinato che dovrei elaborare immediatamente ogni DataTable in arrivo. Pensando allo ConcurrentQueue<T>
... ma non vedo come il metodo WriteQueuedData()
saprebbe che rimpicciolisce una tabella e la scrive nel database.
Per esempio:
public class TableTransporter
{
private ConcurrentQueue<DataTable> tableQueue = new ConcurrentQueue<DataTable>();
public TableTransporter()
{
tableQueue.OnItemQueued += new EventHandler(WriteQueuedData); // no events available
}
public void ExtractData()
{
DataTable table;
// perform data extraction
tableQueue.Enqueue(table);
}
private void WriteQueuedData(object sender, EventArgs e)
{
BulkCopy(e.Table);
}
}
mia prima domanda è, a parte il fatto che io in realtà non ci sono eventi a sottoscrivere, se chiamo ExtractData()
modo asincrono Sarà questo tutto quello che mi serve? Secondo, c'è qualcosa che mi manca nel modo in cui funzioni ConcurrentQueue<T>
e che necessitano di una qualche forma di trigger per funzionare in modo asincrono con gli oggetti in coda?
Aggiornamento Ho appena derivata una classe da ConcurrentQueue<T>
che ha un gestore di eventi OnItemQueued. Quindi:
new public void Enqueue (DataTable Table)
{
base.Enqueue(Table);
OnTableQueued(new TableQueuedEventArgs(Table));
}
public void OnTableQueued(TableQueuedEventArgs table)
{
EventHandler<TableQueuedEventArgs> handler = TableQueued;
if (handler != null)
{
handler(this, table);
}
}
Eventuali dubbi su questa implementazione?
Pensavo di avere 2 fili. In pratica, il thread principale attende l'attivazione dell'evento. Il secondo thread inizia come una chiamata asincrona a 'ExtractData()'. Nel callback asincrono continuerò semplicemente il processo di estrazione. – IAbstract
In realtà, penso di averlo indietro; il thread principale dovrebbe essere costituito da data-code di messa in coda; quindi iniziare il metodo di scrittura asincrona tramite il trigger dell'evento dell'elemento accodato. – IAbstract