2010-08-12 95 views
1

我有一個控制檯應用程序,它與另一個用戶界面進行交互。接口發送命令,我的應用程序應該處理它們。在處理和執行命令時,一直聽我的控制檯應用程序很重要。所以我在主線程上監聽接口並在另一個線程中執行命令。已排序執行線程

下面的例子是我正在嘗試和問題是執行線程沒有排序。

第二件事是我在ProcessCommand方法中使用鎖,但我不確定它是否安全。例如,一個線程可以在ProcessCommand方法內,因此一個線程處於鎖定狀態,因此其他線程可以更改傳入輸入值。我對嗎 ?我做了一些測試,但從未發生過,但仍然懷疑它。

什麼是最佳解決方案?解決方案可以是線程化或不線程化。

class Program 
{ 
    static object locker = new object(); 
    static void Main(string[] args) 
    { 
     while (true) 
     { 
      var input = Console.ReadLine(); 
      (new Thread(new ParameterizedThreadStart(ProcessCommand))).Start(input); 
     } 
     Console.ReadKey(); 
    } 
    static void ProcessCommand(dynamic input) 
    { 
     lock (locker) 
     { 
      Console.WriteLine(input); 
      //process incoming command 
     } 
    } 
} 

回答

4

您正在爲每一行輸入開始一個新線程。這就是爲什麼你不能保證訂購。

取而代之的是,創建一個「閱​​讀器」可以放入行,「處理器」可以讀取的隊列。有一個線程讀取和一個線程處理。我在生產者/消費者隊列的線程教程中有some sample code,儘管它非常簡單。

如果你使用.NET 4.0(我猜你是給出了使用的dynamic),然後並行擴展使得這容易使用BlockingCollection<T>IProducerConsumerCollection<T>。今天是你的幸運日 - Joe Albahari已在他的網站上公開發表Parallel Extensions part of C# 4 in a Nutshell。通讀一下,它應該使一切更清晰。你可能想跳到BlockingCollection<T> part,但這都值得一讀。

+1

我的鎖實現呢?當另一個線程輸入方法時,傳入的命令可以在鎖中更改 – Freshblood 2010-08-12 18:46:06

+0

@Freshblood:不,它不會改變每個線程正在處理的內容......它只是強制你的線程被序列化 - 每次只有一個線程被激活,使得它首先有多個線程毫無意義。 – 2010-08-12 18:59:06

+0

我喜歡那個網站。多年來我一直在使用它作爲參考。 – 2010-08-12 23:02:30