2011-01-30 215 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() 
     { 
      //... 
     } 
    } 

}