在异步回调中从NetworkStream读取缓冲区

问题描述 投票:1回答:1

另见Understand the NetworkStream.EndRead() example from MSDN

我正在尝试使用BeginReadEndRead方法从NetworkStream异步读取(具体来说,我想打开一个NetworkStream,执行各种其他任务,然后处理在NetworkStream上收到的数据)。 EndReadhere)的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.
}
c# networkstream
1个回答
1
投票

当正在执行回调时,数据已经传输到传递给前面的BeginRead调用的缓冲区中。给出示例的问题是它试图使用本地myReadBuffer缓冲区来读取初始消息。相反,你应该将传递给BeginRead的缓冲区传递给EndRead。您可以通过将其作为此缓冲区的类的实例成员,将其与NetworkStream作为stateBeginRead参数一起传递,在某些方法中使用闭包变量来启动读取循环等来实现。

© www.soinside.com 2019 - 2024. All rights reserved.