2011-01-13 122 views
1

我有一個C#HttpListener,它運行在單個線程上並解析由另一個程序發送給它的數據。我的主要問題不是所有發送到服務器的數據都收到了。我只假設這是由於它在單個線程上運行的限制。我已經搜索了一個簡單的多線程解決方案的高和低,所以它可能會收到發送給它的數據,並空手。任何幫助將其轉換爲多線程應用程序將不勝感激。C#從單線程切換到多線程

private void frmMain_Load(object sender, EventArgs e) 
    { 
     Thread t = new Thread(new ThreadStart(ThreadProc)); 
     t.Start(); 
    } 

    public static void ThreadProc() 
    { 
     while (true) 
     { 
      WebBot.SimpleListenerExample(new string[] { "http://localhost:13274/" }); 
      //Thread t = new Thread(new ThreadStart(ThreadProc)); 
      //t.Start(); 
      Application.DoEvents(); 
     } 
    } 

回答

1

首先要做的是:確認你的假設確實是正確的。你需要檢查:

  1. 有多少數據被髮送
  2. 多少數據被接收
  3. 多久
  4. 多長時間需要對數據
  5. 操作做才能發送數據

HTTP在TCP上工作,TCP通常保證傳送,所以即使需要很長時間,您的服務器也應該獲取所有傳入的信息。

這就是說,如果你仍然想使這一進程多線程的,我會建議如下設計:

喜歡你
  1. 一個線程都現在(監聽線程),接受傳入數據。
  2. 另一組將處理傳入數據的線程(WORKER THREADS)。
  3. 偵聽器線程只會接收數據並將其放入隊列中。
  4. 工作線程將使隊列出隊並操作數據。

一些筆記和事情要考慮,但:

  1. 保重線程同步的 - 特別是,你需要保護的隊列。
  2. 想想問一下哪個工作線程會獲取數據。如果有幾個區塊需要照顧特定的工作線程,那麼您需要解決這個問題。
  3. 在某些情況下,如果監聽線程負載非常高,隊列可能會成爲瓶頸,或者更確切地說 - 隊列上的鎖定可能會成爲瓶頸。在這種情況下,我建議移動到N個工作線程的N個隊列的模型中,並讓偵聽器以循環方式選擇一個。這將最大限度地減少鎖,因爲你將有一個閱讀器和一個作家,甚至可以在沒有鎖的情況下離開(但這超出了該答案的範圍)。

還有一種選擇是使用線程池。線程池是一個線程池,它們在需要時一直處於休眠狀態。當偵聽器得到一個輸入輸入時,它會將它分配給一個空閒線程,或者如果需要的話會擴大池;這樣你沒有一個隊列,並且你的線程被優化使用。