2011-08-21 164 views
1

我有客戶端服務器項目。我在從服務器發送數據到客戶端時遇到問題。爲什麼networkstream.write阻止?

private bool SendPack(object client, string data) 
    { 
     lock (this) 
     { 
      try 
      { 
       NetworkStream clientStream = tcpServer.GetStream(); 

       byte[] Pack= ClsEncryption.GetEncrypt(data); 

       clientStream.Write(Pack, 0, Pack.Length); 
       clientStream.Flush(); 

       return true; 
      } 

      catch 
      {      
       return false; 
      } 
     } 
    } 

雖然我使用鎖,當寫命令運行時,一切都毀了。我的意思是沒有發送和寫不返回(如阻止)。我應該通過使用beginwrite還是不使用異步方法?我如何檢查網絡流是否準備好寫入並且不會阻塞。我使用clientstream.canwrite,但它沒有用。

我需要最快和最可靠的方式發送數據。 任何想法?

+0

Offtopic建議:你應該避免使用鎖定(this)。見http://stackoverflow.com/questions/251391/why-is-lockthis-bad。 –

+1

什麼是'tcpServer'?你如何創建它?請張貼更多相關的代碼。 –

+0

它是服務器嘗試向其發送數據的客戶端對象。 –

回答

-1

按照documentation可以使用CanWrite屬性:

if (clientStream.CanWrite) 
{ 
    clientStream.Write(Pack, 0, Pack.Length); 
    clientStream.Flush(); 
    return true; 
} 
+2

我不相信CanWrite與此相關。事實上,我很期望在這種情況下總是這樣的 –

+0

@Marc我期望它回答「檢查網絡流是否準備好寫入」問題。否則它的目的是什麼? –

+0

表明它是一個支持輸出操作的流 - 它的確如此 –

0

如果有與其他線程此流同時進行讀取操作,如果讀操作在同一個實例使用鎖,線程將possably僵局。 如果是這樣,請使用不同的實例來鎖定讀取和寫入操作或發送|讀取鎖語句之外的數據。