キューを処理する最善の方法を理解しようとしています。私はDataTableを返すプロセスを持っています。各DataTableは、前のDataTableとマージされます。 1つの問題があります。最後のBulkCopy(OutOfMemory)まで保持するレコードが多すぎます。ConcurrentQueueを使用してスレッドを処理する方法<T>
したがって、私は各着信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>
機能とキューに入れられたオブジェクトと非同期に動作するトリガーのいくつかのフォームが必要ですか?
更新 私はちょうどOnItemQueuedイベントハンドラを持っているConcurrentQueue<T>
からクラスを派生してきました。次に:
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);
}
}
この実装についての懸念はありますか?
私は2つのスレッドがあると思いました。主スレッドは、基本的にイベントがトリガーするのを待ちます。 2番目のスレッドは 'ExtractData()'への非同期呼び出しとして開始します。非同期コールバックでは、単に抽出プロセスを続行します。 – IAbstract
実際、私はそれを後方に持っていると思います。メインスレッドはキューイングしているデータテーブルでなければなりません。エンキューされた項目イベントトリガーを介して非同期書き込みメソッドを開始します。 – IAbstract