Estoy tratando de averiguar cuál será la mejor forma de trabajar con una cola. Tengo un proceso que devuelve una DataTable. Cada DataTable, a su vez, se fusiona con la DataTable anterior. Hay un problema, demasiados registros para mantener hasta la final BulkCopy (OutOfMemory).Cómo trabajar con threading con ConcurrentQueue <T>
Por lo tanto, he determinado que debo procesar cada DataTable entrante de inmediato. Pensando en el ConcurrentQueue<T>
... pero no veo cómo el método WriteQueuedData()
sabría dequeuear una tabla y escribirla en la base de datos.
Por ejemplo:
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);
}
}
Mi primera pregunta es, aparte del hecho de que en realidad no tienen ningún evento para la suscripción, si llamo ExtractData()
asíncrona será este todo lo que necesito? En segundo lugar, ¿hay algo que me falta sobre la forma en que funciona ConcurrentQueue<T>
y que necesita alguna forma de desencadenador para trabajar de forma asíncrona con los objetos en cola?
actualización Me acaban de deriva una clase de ConcurrentQueue<T>
que tiene un controlador de eventos OnItemQueued. Entonces:
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);
}
}
¿Tiene alguna preocupación acerca de esta implementación?
Pensé que tenía 2 hilos. El hilo principal básicamente esperaría a que se desencadene el evento. El segundo subproceso comienza como una llamada asincrónica a 'ExtractData()'. En la devolución de llamada asíncrona, simplemente continuaré el proceso de extracción. – IAbstract
En realidad, creo que lo tengo al revés; el hilo principal debería ser la puesta en cola de las tablas de datos; luego comience el método de escritura asíncrona a través del desencadenador de evento de elemento en cola. – IAbstract