【发布时间】:2011-05-31 20:49:12
【问题描述】:
我正在尝试找出使用队列的最佳方式。我有一个返回 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);
}
}
对此实现有任何顾虑吗?
【问题讨论】:
-
仅供现在来到这里的任何人参考:如果您拥有 .NET 4.5+,建议将任务并行库用于广泛的多线程使用。对于生产者/消费者队列,请考虑 Dataflow:How to: Implement a Producer-Consumer Dataflow Pattern,正如所讨论的 in Mathew Watson's answer here
标签: c# multithreading queue concurrent-collections