使用并发启用队列<T>

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会将一个出列表传递给事件订阅者.这个实现会为我提供一个线程安全的队列吗?

SLa*_*aks 2

当您将项目放入队列时,您正在使它们出队。
您需要使用您的参数引发事件。

它是否真正是线程安全的取决于你如何使用它。
如果您曾经检查过Count或检查是否为空,则它不是线程安全的,并且不能轻易使其成为线程安全的。
如果不这样做,您可能可以使用比队列更简单的东西。