我有一个WPF应用程序,我需要听取和处理事件针对某一类应用程序的生命周期。创建一个线程来处理事件特定类
它是不好的做法,创建一个包装类,创建它的一个静态实例,并称之为“StartListening()”?如果在这个静态实例上发生不受控制的异常会怎么样?它会像在ASP.NET应用程序中一样拆卸整个应用程序吗?
我应该QueueUserWorkItem,创建一个类,附加的事件,然后把某种而(真){}语句来保持线程活着吗?
什么是最好的做法是什么?
我有一个WPF应用程序,我需要听取和处理事件针对某一类应用程序的生命周期。创建一个线程来处理事件特定类
它是不好的做法,创建一个包装类,创建它的一个静态实例,并称之为“StartListening()”?如果在这个静态实例上发生不受控制的异常会怎么样?它会像在ASP.NET应用程序中一样拆卸整个应用程序吗?
我应该QueueUserWorkItem,创建一个类,附加的事件,然后把某种而(真){}语句来保持线程活着吗?
什么是最好的做法是什么?
对我来说,这似乎是一个经典的出版者/听众的问题。
我会创建一个接口:IMyClassNameEventListener
并使MyClass
将它的一个实例作为构造函数参数。然后在构造函数中,我会在接口实例上调用Attach(MyClass obj)
方法。当然,这个监听器有一个单例生命周期,它不需要是静态的。
稍好一点的方法是使用工厂创建MyClass
的实例,然后执行附加操作,因此Attach
调用和依赖项不在构造函数中。
阉的应用程序会失败将取决于你如何启动监听器。您可以查看TaskFactory
类,它提供了处理异常传播的选项。如果侦听器失败,您希望应用程序的行为如何?
当然侦听器对象本身,你只需要拥有的代码运行时有什么处理。所以,当你收到一个事件时,你启动一个线程。如果您只想运行一个线程,则可以使用一系列操作。
里面的监听器类,你可能希望有类似以下内容:
private Queue<Action> ActionQueue = new Queue<Action>();
private object LockObj = new Object();
private volatile bool IsRunning;
public void Attach(Class1 obj)
{
obj.SomeEvent += this.HandleEvent;
}
private void HandleEvent(object sender, EventArgs e)
{
lock(this.LockObj)
{
this.ActionQueue.Enque(() => this.Handle(sender, e));
if (!this.IsRunning)
{
Task.Factory.StartNew(() => this.Loop());
}
}
}
private void Loop()
{
this.IsRunning = true;
while ((Action action = this.DequeueAction()) != null)
action();
this.IsRunning = false;
}
private Action DequeueAction()
{
lock (this.LockObj)
{
return this.ActionQueue.Count > 0 ? this.ActionQueue.Dequeue() : null;
}
}
private void Handle(object sender, EventArgs e)
{
//handling code
}
可以;吨真的跟着,你可以分享一些代码? – bas 2013-02-10 18:44:38
为什么你需要一个单独的线程呢?你需要轮询信息吗? – Clemens 2013-02-10 19:01:04