我有一个队列中的项目我想要在一个线程中处理,并且任何类的实例都可以将项目添加到要处理的队列中。C#启动一个静态线程
我的想法是在处理项目的类中有一个静态线程,唯一的问题是我不知道从哪里开始线程,因为我无法在其初始化中启动它。
有没有办法启动一个静态线程?或者我应该完全改变架构?
我有一个队列中的项目我想要在一个线程中处理,并且任何类的实例都可以将项目添加到要处理的队列中。C#启动一个静态线程
我的想法是在处理项目的类中有一个静态线程,唯一的问题是我不知道从哪里开始线程,因为我无法在其初始化中启动它。
有没有办法启动一个静态线程?或者我应该完全改变架构?
可以在static constructor该类启动使用典型的单例方法在类的常规构造函数中启动它。
或者您可以使用新的.NET 4 Lazy<T>
方法来实例化并启动它。
但是在类构造函数中工作通常不是一个好习惯。更好的方法是确保线程只有在有人打电话时才存在,比如说类别为Execute()
。在Execute
方法中,您可以使用Lazy<T>
或单例方法来创建和启动将处理它的单个线程实例。
纯粹主义者会指出,实际上你可能根本不想这样做,并且Factory方法可能更适合于创建类的实例,并且应该分离类和进程之间的关系它。
其他人会建议您根本不需要线程,只需使用.NET4 Task
s并使用框架提供的队列/执行方法将项目排队等待执行。
给您有处理实际线程私有内部类的静态队列类:
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()
{
//...
}
}
}
谢谢!静态构造函数是一个令人敬畏的语言特性,我从来不会想到,因为我从C++转换而来,它没有任何特性。完善。 – Drew 2011-01-30 08:03:47