C#:当对象添加到队列时触发事件 [英] C#: Triggering an Event when an object is added to a Queue

查看:1162
本文介绍了C#:当对象添加到队列时触发事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

每当将对象添加到 Queue< Delegate> 中时,我需要能够触发事件。

I need to be able to trigger a event whenever an object is added to a Queue<Delegate>.

我创建了一个扩展 Queue的新类,

public delegate void ChangedEventHandler(object sender, EventArgs e);

public class QueueWithChange<Delegate> : Queue<Delegate>
{
    public event ChangedEventHandler Changed;

    protected virtual void OnChanged(EventArgs e) {
        if (Changed != null)
        {
            Changed(this, e);
        }
    }
}

然后将事件从另一个类,像这样:

And then attached the event from another class, like such:

QueueWithChange<TimerDelegate> eventQueue = new QueueWithChange<TimerDelegate>();

//

eventQueue.Changed += new ChangedEventHandler(delegate(object s, EventArgs ex) {
    //This event is not being triggered, so this code is unreachable atm...and that is my problem

    if (eventQueue.Count > 0)
    {
        eventQueue.Dequeue().Invoke(new DispatcherTimer() { Interval = TimeSpan.FromMilliseconds(5) });
        actionTimer.Stop();
    }
});

但是当我排队一个对象( eventQueue.Enqueue(something) code>),附加的事件没有被触发。

But whenever I enqueue an object (eventQueue.Enqueue(something)), the attached event is not being fired.

我在这里缺少什么?

推荐答案

如果你的意思是非通用的 Queue 类,那么你可以覆盖 Enqueue

If you mean the non-generic Queue class, then you can just override Enqueue:

public override void Enqueue(object obj)
{
    base.Enqueue(obj);
    OnChanged(EventArgs.Empty);
}

但是,如果你的意思是通用的 Queue&T ; 类,然后注意没有适当的虚拟方法来覆盖。您可能会更好地将封装到您自己的类的队列中:

However, if you mean the generic Queue<T> class, then note that there is no suitable virtual method to override. You might do better to encapsulate the queue with your own class:

(**重要编辑:删除基类!!! ** )

(** important edit: removed base-class!!! **)

class Foo<T>
{
    private readonly Queue<T> queue = new Queue<T>();
    public event EventHandler Changed;
    protected virtual void OnChanged()
    {
        if (Changed != null) Changed(this, EventArgs.Empty);
    }
    public virtual void Enqueue(T item)
    {
        queue.Enqueue(item);
        OnChanged();
    }
    public int Count { get { return queue.Count; } }

    public virtual T Dequeue()
    {
        T item = queue.Dequeue();
        OnChanged();
        return item;        
    }
}

然而,看着你的代码,似乎有可能你在这里使用多个线程如果是这样,请考虑线程队列

However, looking at your code, it seems possible that you are using multiple threads here. If that is the case, consider a threaded queue instead.

这篇关于C#:当对象添加到队列时触发事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆