C#:将对象添加到队列时触发事件 [英] C#: Triggering an Event when an object is added to a Queue
问题描述
我需要能够在将对象添加到 Queue
时触发事件.
I need to be able to trigger a event whenever an object is added to a Queue<Delegate>
.
我创建了一个扩展 Queue
的新类:
I created a new class that extends 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)
) 时,附加的事件都不会被触发.
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
类,请注意没有合适的虚方法可以覆盖.您最好用自己的类封装队列:
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屋!