c #: событие в очереди для очереди <T> - PullRequest
3 голосов
/ 01 октября 2010

Я новичок в мероприятии и делегатах.Не могли бы вы указать правильное направление реализации события Enqueued для объекта типа Queue ?

Я использую C # и .Net 4.0

Спасибо

Ответы [ 2 ]

14 голосов
/ 01 октября 2010

Вы можете инкапсулировать класс Queue в свой собственный класс, например:

class MyQueue<T>
{
    private readonly Queue<T> queue = new Queue<T>();     
    public event EventHandler Enqueued;     
    protected virtual void OnEnqueued()     
    {         
        if (Enqueued != null) 
        Enqueued(this, EventArgs e);     
    }     
    public virtual void Enqueue(T item)     
    {         
        queue.Enqueue(item);         
        OnEnqueued();     
    }     
    public int Count 
     {
             get 
             { 
                     return queue.Count; 
             }
     }
    public virtual T Dequeue()     
    {
            T item = queue.Dequeue();         
            OnEnqueued();
            return item;
        }
} 

НТН!

6 голосов
/ 01 октября 2010

Нет событий, запускаемых из набора классов System.Collections. *. Поскольку вы используете .NET 4.0, вы можете захотеть взглянуть на BlockingCollection<T>, который вместо того, чтобы полагаться на события, вы бы использовали шаблон Producer-Consumer для получения элементов. из коллекции, поскольку они прибывают из другого потока. BlockingCollection<T> позаботится обо всей поточной безопасности и синхронизации для вас эффективно.

Тип поддержки по умолчанию для BlockingCollection<T> равен ConcurrentQueue<T>, что звучит так, как вы хотите, но следует отметить, что вы можете изменить его на использование ConcurrentStack<T> или ConcurrentBag<T>, если вы хотите / не возражаете против различных характеристик заказа.

Еще одна замечательная особенность BlockingCollection<T> - это возможность устанавливать границы , которая может помешать производителю добавлять больше элементов в коллекцию, чем потребители могут не отставать.

Для отличного описания всех аспектов этой темы, я предлагаю вам прочитать это сообщение в блоге от Alexeandra Rusina. В посте также рассматриваются способы работы с BlockingCollection с использованием параллельной библиотеки задач .

...