IAb*_*act 10 c# queue multithreading .net-3.5
我有一个先前的问题,我提供了我的解决方案; 但是,ConcurrentQueue<T>因为我在.Net 3.5上,所以我没有访问权限.我需要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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此,当DataTable排队时,EventArgs会将一个出列表传递给事件订阅者.这个实现会为我提供一个线程安全的队列吗?
当您将项目放入队列时,您正在使它们出队。
您需要使用您的参数引发事件。
它是否真正是线程安全的取决于你如何使用它。
如果您曾经检查过Count或检查是否为空,则它不是线程安全的,并且不能轻易使其成为线程安全的。
如果不这样做,您可能可以使用比队列更简单的东西。