Я пытаюсь понять, каким будет лучший способ работы с очередью. У меня есть процесс, который возвращает DataTable. Каждый DataTable, в свою очередь, объединяется с предыдущим DataTable. Существует одна проблема: слишком много записей для хранения до окончательного BulkCopy (OutOfMemory).
Итак, я решил, что я должен немедленно обработать каждый входящий DataTable. Думая о ConcurrentQueue<T>
... но я не вижу, как метод WriteQueuedData()
знал бы, чтобы удалить из таблицы таблицу и записать ее в базу данных.
Например:
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);
}
}
Мой первый вопрос: кроме того, что на самом деле у меня нет каких-либо событий для подписки, если я называю ExtractData()
асинхронно, это все, что мне нужно? Во-вторых, есть ли что-то, что мне не хватает в функции ConcurrentQueue<T>
и нужно, чтобы какая-то форма триггера работала асинхронно с объектами в очереди?
Обновление
Я только что получил класс из ConcurrentQueue<T>
, у которого есть обработчик события OnItemQueued. Тогда:
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);
}
}
Любые опасения по поводу этой реализации?