[英]Read buffer from NetworkStream in async callback
另請參閱了解 MSDN 中的 NetworkStream.EndRead() 示例。
我正在嘗試使用BeginRead
和EndRead
方法從 NetworkStream 異步讀取(具體來說,我想打開一個 NetworkStream,執行各種其他任務,然后處理在 NetworkStream 上接收到的數據)。 EndRead
的 MSDN 示例( 此處)存在各種問題,並且無法按原樣工作,如鏈接問題中所述。 該問題的答案顯示了基本代碼的結構,但它不包括在回調中從 NetworkStream 實際讀取數據。
在回調函數中,如何將從 NetworkStream 讀取的數據傳輸到緩沖區?
編輯
這是原始的 MSDN 示例。
public static void myReadCallBack(IAsyncResult ar )
{
NetworkStream myNetworkStream = (NetworkStream)ar.AsyncState;
byte[] myReadBuffer = new byte[1024];
String myCompleteMessage = "";
int numberOfBytesRead;
numberOfBytesRead = myNetworkStream.EndRead(ar);
myCompleteMessage = String.Concat(myCompleteMessage,Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead));
// message received may be larger than buffer size so loop through until you have it all.
while(myNetworkStream.DataAvailable)
{
myNetworkStream.BeginRead(myReadBuffer, 0, myReadBuffer.Length, new AsyncCallback(NetworkStream_ASync_Send_Receive.myReadCallBack), myNetworkStream);
}
// Print out the received message to the console.
Console.WriteLine("You received the following message : " + myCompleteMessage);
}
這個例子的基本問題是沒有數據從 NetworkStream 傳輸到myReadBuffer
。
編輯 1
感謝 Dmytro Mukalov,以下代碼有效:
internal class CallbackArgs
{
public NetworkStream Stream { get; set; }
public byte[] Buffer { get; set; }
public CallbackArgs(NetworkStream stream, byte[] buffer)
{
Stream = stream;
Buffer = buffer;
}
}
// In the caller:
// (Create and open thisNetworkStream, and check thisNetworkStream.CanRead)
byte[] thisReadBuffer = new byte[1024];
CallbackArgs args = new CallbackArgs(thisNetworkStream, thisReadBuffer);
thisNetworkStream.BeginRead(thisReadBuffer, 0, thisReadBuffer.Length, new AsyncCallback(myReadCallBack), args);
// The callback function:
public static void myReadCallBack(IAsyncResult ar)
{
CallbackArgs args = (CallbackArgs)ar.AsyncState;
NetworkStream myNetworkStream = args.Stream;
byte[] myReadBuffer = args.Buffer;
// myReadBuffer now contains the data read from the network stream.
int bytesRead = myNetworkStream.EndRead(ar);
// Do work on myReadBuffer, etc.
}
執行回調時,數據已傳輸到傳遞給前一個BeginRead
調用的緩沖區中。 給定示例的問題是它試圖使用本地myReadBuffer
緩沖區來讀取初始消息。 相反,您應該使傳遞給BeginRead
的緩沖區可用於EndRead
。 您可以通過使其成為此緩沖區的類的實例成員,將其與NetworkStream
作為BeginRead
state
參數一起傳遞,在某些方法中使用閉包變量來啟動讀取循環等來實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.