c# - 从 NetworkStream 调用 BeginRead

标签 c# network-programming networkstream

好的,我想连接到 Socket 并使用 System.Net.Sockets.NetworkStream 类读取网络流。这是我目前所拥有的:

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, ??, ??);

现在我需要一个 AsyncCallback 和一个 Object state 来完成我的 BeginRead 方法,但我什至不确定这是否会工作。在这一点上我有点迷路了!我需要从这里去哪里?

最佳答案

基本上,当您在异步操作上调用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,则使用 FromAsync method 会变得更加容易在 TaskFactory class 上.

关于c# - 从 NetworkStream 调用 BeginRead,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8083592/

相关文章:

c# - TCP 套接字/NetworkStream 意外失败

c# - 如何在图片框控件中突出显示图像的特定部分

c# - 在 C# 中使用 TaskDialogIndirect

linux - 使用静态/固定 IP 接收 DNS

c# - .NET NetworkStream读取速度慢

c# - 当我的一个客户端崩溃时,NetworkStream.Write 挂起我的服务器应用程序

c# - 需要在netMQ中使用inproc保持一个线程接收消息还是有更好的方法?

c# - 如何从总和为 y 的唯一小数列表中随机获取 x 位小数?

c++ - 模拟管理员用户时使用 AddIPAddress 时出现问题

java - Quartz调度器通过FTP下载文件