Как работать с многопоточностью с ConcurrentQueue

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

Есть ли сомнения по поводу этой реализации?

18
задан IAbstract 29 December 2010 в 03:25
поделиться