C#启动一个静态线程

时间:2011-01-30 07:17:01

标签: c# multithreading static

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

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

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

2 个答案:

答案 0 :(得分:5)

您可以在课程的static constructor中启动它:

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

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

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

但在课程构建者中完成工作通常不是一个好习惯。更好的方法是确保线程仅在有人调用时存在,比如在类的实例上说Execute()。在Execute方法中,您可以使用Lazy<T>或单例方法来创建和启动将处理它的单个线程实例。

纯粹主义者会指出,实际上你可能根本不想这样做,并且工厂方法可能更适合创建你的班级实例,你应该将你的班级和工人之间的关注区分开来处理它。

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

答案 1 :(得分:2)

为静态队列类提供一个处理实际线程的私有内部类:

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()
        {
            //...
        }
    }

}