我有一個隊列中的項目我想要在一個線程中處理,並且任何類的實例都可以將項目添加到要處理的隊列中。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