【问题标题】:Calling BeginRead from a NetworkStream从 NetworkStream 调用 BeginRead
【发布时间】:2011-11-10 17:17:33
【问题描述】:

好的,我想连接到 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 方法,但我什至不确定这是否可行。在这一点上我有点迷路了!我需要从这里去哪里?

【问题讨论】:

  • 你走错了路。使用 Socket.BeginReceive() 的 MSDN 库示例代码。
  • 你有理由使用异步版本吗?你不能用Read()吗?
  • 这行得通吗?最终我想拥有一个持续运行的服务,但现在我只想看到一些结果。另外,谢谢汉斯,我会检查一下。

标签: c# network-programming networkstream


【解决方案1】:

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

【讨论】:

  • 或者,如果您使用 .NET Framework 4.5+ 或 .NET Standard/Core,您可以在 async 方法中使用 Stream.ReadAsync
猜你喜欢
  • 2011-05-22
  • 2011-10-28
  • 1970-01-01
  • 2015-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-28
  • 1970-01-01
相关资源
最近更新 更多