2012-07-31 52 views
0

我有一個網絡服務器,我切換到使用同步Begin ..來處理短命的請求,這是一個巨大的進步。 對於長期居住的人來說,創建了兩個線程,隨着客戶數量的增加,它開始成爲一個問題。異步解析非長度定界數據

通過這些連接傳輸的數據是4到40個字節的消息。 但是它們不是長度分隔的,它們的長度可以取決於消息中的部分。可悲的是,我無法改變協議。 您可以將協議看作是一種快節奏的telnet終端協議。

我尋找到的讀取和解析傳入的消息/「線」使用Stream.BeginRead,並達成了兩項憂慮:

  1. 其高效調用的BeginRead約3次,10字節的消息?
  2. 如何高效地編寫代碼這樣做

下面是一個例子。雖然信息本身不是長度的前綴,但它的一些內容可能是。

同步方式(電流)

int length = reader.ReadInt32(); 
byte[] buffer = reader.ReadBytes(length); 

異步方法

... 
    //Here we have received a byte array 
    int length = ParseIntegerFromBuffer(buffer); 
    stream.BeginRead(buffer, 0, length, Part1Read, null); 
} 
private void Part1Read(IAsyncResult result) 
{ 
    ... 

異步例子不是我使用的是什麼,我已經寫了需要幾分鐘包裝注意檢查所請求字節數的成功讀取。 在編寫和理解我可以得到的書面代碼方面,這是否有效?

我的代碼必須在.NET 3.5上運行,但未來5和選項,我應該等待它,然後做異步編程?

如果我使用同步閱讀,此代碼將面向互聯網,任何掛起的傳入連接都會鎖定線程池線程。

回答

0

我完成了異步實現,結果是CPU負載比每個連接有一個線程的設計高4倍。

被解析的協議本身設計得很差,試圖異步解析它並不能幫助管理更多的連接。