gpt4 book ai didi

c# - Stream EndRead 什么时候阻塞回调

转载 作者:太空宇宙 更新时间:2023-11-03 11:04:50 28 4
gpt4 key购买 nike

我对使用异步模式进行流读写比较陌生,想知道这个问题的答案是否如此明显,以至于没有明确地写在任何地方:

当调用 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com