Я пытаюсь выяснить, каким будет лучший способ работы с очередью. У меня есть процесс, который возвращает 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);
}
}
Есть какие-либо опасения по поводу этой реализации?