- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我对使用异步模式进行流读写比较陌生,想知道这个问题的答案是否如此明显,以至于没有明确地写在任何地方:
当调用 NetworkStream.BeginRead
时,我传递了一个回调参数,根据 MSDN,该参数在“BeginRead 完成时”执行。它还说“您的回调方法应该调用 EndRead 方法。”
然后根据 NetworkStream.EndRead
的文档,“方法完成了在 BeginRead 方法中启动的异步读取操作。”它还提到此方法“在数据可用之前阻塞”。
我知道 EndRead 方法对于确定接收到的字节数也很有用。
我的问题是:
如果在 BeginRead 回调中调用 EndRead 方法,它真的会阻塞吗?调用回调时读取操作是否已经完成?
示例代码
byte[] streamBuffer = new byte[1024];
public void SomeFunction()
{
TcpClient client = new TcpClient();
client.Connect(IPAddress.Parse("127.0.0.1"), 32000);
NetworkStream stream = client.GetStream();
stream.BeginRead(streamBuffer,0,streamBuffer.Length,ReadCallback,stream);
}
public void ReadCallback(IAsyncResult ar)
{
NetworkStream stream = ar.AsyncState as NetworkStream;
// Will this call ever actually "block" or will it
// return immediately? Isn't the read operation
// already complete?
int bytesRead = stream.EndRead(ar);
// Other stuff here
}
最佳答案
当回调触发时,读取操作总是完成。完成是首先触发回调的原因。所以在回调方法中使用 EndRead() 永远不会阻塞。
请注意,“完成”也可以表示“失败”,EndRead() 将抛出异常。一个非常常见的异常是 ObjectDisposedException,当异步读取正在进行时套接字关闭时抛出。通常当您退出程序时,一定要捕获它。
关于c# - Stream EndRead 什么时候阻塞回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16280840/
与使用(双向)NetworkStream 的异步 IO 相关,MSDN说“每次调用 BeginRead 都必须调用一次 EndRead。” 即使对于 EndRead() 将抛出异常的情况,例如在发出
我对使用异步模式进行流读写比较陌生,想知道这个问题的答案是否如此明显,以至于没有明确地写在任何地方: 当调用 NetworkStream.BeginRead 时,我传递了一个回调参数,根据 MSDN,
我想知道在我的 C# 异步套接字中,在 EndRead 调用中接收到 0 字节是否意味着服务器实际上已经断开了我们的连接? 我看到的许多例子都表明是这种情况,但我收到的断开连接频率比我预期的要高得多。
我编写了一个通过 SslStream 进行通信的 TcpClient 和服务器。通信有效,但是当我从客户端向服务器发送消息时,服务器首先读取 1 个字节,然后在下一步中读取其余部分。例子:我想通过Cl
我还不太“了解”async 和 await,我正在寻找关于我将要解决的特定问题的一些说明。基本上,我需要编写一些代码来处理 TCP 连接。它基本上只是接收数据并处理它,直到连接关闭。 我通常使用 Ne
我正在使用 NetworkStream.BeginRead/EndRead 从套接字进行异步读取。 但是,NetworkStream.EndRead() 有时会返回 0(即从套接字读取了 0 个字节)
我试图理解 NetworkStream.EndRead() 的 MSDN 示例。有些部分我不明白。 下面是示例(从 MSDN 复制): // Example of EndRead, DataAvail
我编写了以下函数来使用 NetworkStream 的异步读取函数(BeginRead 和 EndRead)实现超时功能。它工作正常,直到我注释掉行 Trace.WriteLine("bytesRea
我是一名优秀的程序员,十分优秀!