我之前有一个相关的问题,我提供了解决方案;但是,因为我使用的是.Net 3.5版本,无法使用ConcurrentQueue<T>
。我需要Queue<T>
来允许并发操作。我阅读了这个问题,如果队列中没有任何项,而线程方法尝试出队列,就会遇到问题。
现在我的任务是确定是否可以派生自己的并发队列类。这是我想到的:
public sealed class ConcurrentQueue : Queue<DataTable>
{
public event EventHandler<TableQueuedEventArgs> TableQueued;
private ICollection que;
new public void Enqueue(DataTable Table)
{
lock (que.SyncRoot)
{
base.Enqueue(Table);
}
OnTableQueued(new TableQueuedEventArgs(Dequeue()));
}
// this is where I think I will have a problem...
new public DataTable Dequeue()
{
DataTable table;
lock (que.SyncRoot)
{
table = base.Dequeue();
}
return table;
}
public void OnTableQueued(TableQueuedEventArgs table)
{
EventHandler<TableQueuedEventArgs> handler = TableQueued;
if (handler != null)
{
handler(this, table);
}
}
}
当 DataTable 被排队时,EventArgs会将出列的表格传递给事件订阅者。这种实现是否会为我提供线程安全的队列?
和
lock(que.SyncRoot)`。 - IAbstractSyncRoot
很有用。在您的情况下,que
是null
。您只需要在方法中锁定单个对象即可。 - SLaks