我有一个我想要在一个线程中处理的项目队列,并且一个类的任何实例都可以将项目添加到要处理的队列中。
我这样做的想法是在处理项目的类中有一个静态Thread,唯一的问题是我不知道从哪里开始这个线程,因为我无法在初始化时启动它。 / p>
有没有办法可以启动静态线程?或者我应该完全改变架构吗?
答案 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()
{
//...
}
}
}