キューを操作する最良の方法は何かを理解しようとしています。DataTable を返すプロセスがあります。次に、各 DataTable が前の DataTable とマージされます。1 つの問題があります。最後の 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);
}
}
この実装に関する懸念事項はありますか?