2013-02-10 69 views
1

我有一个WPF应用程序,我需要听取和处理事件针对某一类应用程序的生命周期。创建一个线程来处理事件特定类

它是不好的做法,创建一个包装类,创建它的一个静态实例,并称之为“StartListening()”?如果在这个静态实例上发生不受控制的异常会怎么样?它会像在ASP.NET应用程序中一样拆卸整个应用程序吗?

我应该QueueUserWorkItem,创建一个类,附加的事件,然后把某种而(真){}语句来保持线程活着吗?

什么是最好的做法是什么?

+0

可以;吨真的跟着,你可以分享一些代码? – bas 2013-02-10 18:44:38

+1

为什么你需要一个单独的线程呢?你需要轮询信息吗? – Clemens 2013-02-10 19:01:04

回答

1

对我来说,这似乎是一个经典的出版者/听众的问题。

我会创建一个接口: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 
} 
相关问题