2011-11-10 153 views
4

好的我想連接到Socket並使用System.Net.Sockets.NetworkStream類讀取網絡流。這是我到目前爲止有:從NetworkStream調用BeginRead

NetworkStream myNetworkStream; 
Socket socket; 

socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, 
    ProtocolType.IPv4); 
socket.Connect(IPAddress.Parse("8.8.8.8"), 8888); 

myNetworkStream = new NetworkStream(socket); 

byte[] buffer = new byte[1024]; 
int offset = 0; 
int count = 1024; 

myNetworkStream.BeginRead(buffer, offset, count, ??, ??); 

現在我需要一個AsyncCallbackObject state完成我BeginRead方法,但我甚至不知道這是去工作。在這一點上我有點失落!我需要從哪裏出發?

+1

你在錯誤的軌道上。使用Socket.BeginReceive()的MSDN Library示例代碼。 –

+0

您有使用異步版本的理由嗎?你不能只使用Read()嗎? – svick

+0

這會工作嗎?最終我希望有一個能夠不斷運行的服務,但現在我只想看到一些結果。另外,謝謝漢斯,我會檢查一下。 – JMK

回答

12

基本上,當調用Begin*方法上一個異步操作,需要有到相應End*語句的呼叫(更詳細的信息,請參閱Asynchronous Programming Overview on MSDN,具體標題爲「結束異步操作」)。

這就是說,你通常要傳遞的方法/匿名方法/ lambda表達式,這將做一兩件事情:

1)調用相應的End*方法,在這種情況下,Stream.EndRead。此調用在被調用時不會被阻止,因爲在操作完成之前不會調用callback(請注意,如果異步調用期間發生異常,則調用End*方法時將拋出此異常)。

2)可能啓動一個新的異步調用。在這種情況下,它假設你想了解更多的數據,因此你應該開始Stream.BeginRead

新的呼叫假設你想要做的#2,您可以執行以下操作:

// Declare the callback. Need to do that so that 
// the closure captures it. 
AsyncCallback callback = null; 

// Assign the callback. 
callback = ar => { 
    // Call EndRead. 
    int bytesRead = myNetworkStream.EndRead(ar); 

    // Process the bytes here. 


    // Determine if you want to read again. If not, return. 
    if (!notMoreToRead) return; 

    // Read again. This callback will be called again. 
    myNetworkStream.BeginRead(buffer, offset, count, callback, null); 
}; 

// Trigger the initial read. 
myNetworkStream.BeginRead(buffer, offset, count, callback, null); 

然而如果您使用.NET 4.0,則使用TaskFactory class上的FromAsync method變得更容易。