簡體   English   中英

在異步回調中從 NetworkStream 讀取緩沖區

[英]Read buffer from NetworkStream in async callback

另請參閱了解 MSDN 中的 NetworkStream.EndRead() 示例

我正在嘗試使用BeginReadEndRead方法從 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM