2011-03-27 66 views
1

我開發在Windows Server上使用C#和.NET 3.5 2008年什麼是C#中的最佳多線程技術

中的TcpListener任務是跑了很多的TcpListener任務 的應用程序:

  1. 聽 獲得一個XML消息
  2. 從中讀出一個ID
  3. 基於ID到發送命令到 特定攝像機拍攝快照,並將其存儲在一個文件夾

這是爲了在1秒內執行,所以我可以採取與照相機快照。我使用以下代碼執行此任務有一段延遲:

private Thread listen_thread; 

    public void start_listen() 
    { 
      this.listen_thread = new Thread(new ThreadStart(save_data)); 
      this.listen_thread.Priority = ThreadPriority.Normal; 
      this.listen_thread.Start(); 

    } 
    private void save_data() 
    { 
     //work to be done 
    } 

這是最好的多線程技術嗎?該應用程序在運行在Dell PowerEdge 2900 2四核prosessor,我認爲這可能走得更快。我該如何能夠改善此代碼的延遲?

那代碼爲的TcpListener

Int32 port = controller_port; 
     try 
     { 
      //this server ip 
      IPAddress localAddr = IPAddress.Parse(this_ip); 
      server = new TcpListener(localAddr, port); 
      server.Start(); 
      Byte[] bytes = new Byte[256]; 
      String data = null; 
      while (true) 
      { 
       Console.Write("Waiting for a connection... "); 
       TcpClient client = server.AcceptTcpClient(); 
       Console.Write("Connected!"); 
       data = null; 
       NetworkStream stream = client.GetStream(); 
       int i; 
       string add_data = ""; 
       Console.Write("Waiting...!"); 
       while ((i = stream.Read(bytes, 0, bytes.Length)) != 0) 
       { 
        try 
        { 
         string full_row = ""; 
         data = System.Text.Encoding.ASCII.GetString(bytes, 0, i); 
         Console.Write("Received from controller: " + data); 
         add_data += data; 
        } 
        catch{} 
       } 
      } 
     } 

然後我把它拿到ID。

+0

哪裏是你的'TcpListener'代碼? – 2011-03-27 14:34:49

+1

您的應用程序CPU綁定或I/O綁定?你有很多併發訪問,或一次只有一個訪問? – 2011-03-27 14:36:19

+3

顯示並不能幫助我們明白什麼重要的代碼...我認爲TCP代碼(或網絡流碼,或插座碼;等等)將是這裏重要的... – 2011-03-27 14:39:25

回答

1

目前尚不清楚,在所有

  1. 如何接收請求
  2. 後,你並行運行何種應用

似乎你聽不同的插座和分配上的每個線程其中。

我認爲這是一個糟糕的選擇,因爲你無法控制的並行度。

您可以改爲只有一個非確定性偵聽所有套接字並將連接分配給線程池的線程,配置爲同時運行最多n個線程,其中n是機器的並行度(如果您有雙重四核,n等於8)。

+0

我正在監聽此服務器上的一個端口。 – Ramah 2011-03-28 11:10:50

+0

ok ..我改變了它..我正在做的是在這個服務器上監聽端口,然後當消息到來時它被讀爲xml,然後將xml分開,並從中獲取id ..所有這一切都在一個線程中。我在另一個線程中調用圖像以便能夠讀取下一個xml消息,而無需等待圖像被捕獲。這是創造約150線程。我現在會嘗試你的建議,希望它會更快。感謝您的幫助 – Ramah 2011-03-28 11:24:06

1

這些方法具有驚人的錯誤名稱。 start_listen()不開始監聽。至少建立一個連接之前,save_data()不可能保存任何數據。這需要客戶端代碼先啓動並建立連接。當然,有一秒很快就消失了。有一個核心可用時,啓動一個線程不會超過幾分之一毫秒。

關注是不可少的程式碼中的代碼。

相關問題