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