繁体   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