2011-01-30 222 views
0

我有一个队列中的项目我想要在一个线程中处理,并且任何类的实例都可以将项目添加到要处理的队列中。C#启动一个静态线程

我的想法是在处理项目的类中有一个静态线程,唯一的问题是我不知道从哪里开始线程,因为我无法在其初始化中启动它。

有没有办法启动一个静态线程?或者我应该完全改变架构?

回答

4

可以在static constructor该类启动使用典型的单例方法在类的常规构造函数中启动它。

或者您可以使用新的.NET 4 Lazy<T>方法来实例化并启动它。

但是在类构造函数中工作通常不是一个好习惯。更好的方法是确保线程只有在有人打电话时才存在,比如说类别为Execute()。在Execute方法中,您可以使用Lazy<T>或单例方法来创建和启动将处理它的单个线程实例。

纯粹主义者会指出,实际上你可能根本不想这样做,并且Factory方法可能更适合于创建类的实例,并且应该分离类和进程之间的关系它。

其他人会建议您根本不需要线程,只需使用.NET4 Task s并使用框架提供的队列/执行方法将项目排队等待执行。

+0

谢谢!静态构造函数是一个令人敬畏的语言特性,我从来不会想到,因为我从C++转换而来,它没有任何特性。完善。 – Drew 2011-01-30 08:03:47

2

给您有处理实际线程私有内部类的静态队列类:

private class MyClass 
{ 
    static MyClass() 
    { 
     // start thread here 
    } 
} 

你还可以:

static class QueueStatic 
{ 
    public static Queue<Object> queue; 
    private static QueueWorker worker; 

    public static void DoQueueAction() 
    { 
     worker = new QueueWorker(queue); 
     ThreadStart t = new ThreadSTart(worker.Work); 
     t.Start(); 
    } 

    //inner class 
    private class QueueWorker 
    { 
     private Queue<Object> queue; 
     public QueueWorker(Queue<Object> queue) 
     { 
      this.queue = queue; 
     } 

     public void Work() 
     { 
      //... 
     } 
    } 

}