gpt4 book ai didi

.net - 为什么我不能使用 Socket.BeginSend 中的 WaitHandle 来等待操作完成?

转载 作者:行者123 更新时间:2023-12-02 15:48:15 24 4
gpt4 key购买 nike

我使用以下代码异步发送数据,但我注意到在从 asyncRes 获取的 AsyncWaitHandle 中使用 WaitOne 根本不等待。我检查了 MSDN,它说我应该使用 ManualResetEvent。

...
var asyncRes = _socket.BeginSend(encodedFrame, 0, encodedFrame.Length, SocketFlags.None, sendCallback, _socket);
...
var success = asyncRes.AsyncWaitHandle.WaitOne(_timeout, true);
...


private void sendCallback(IAsyncResult ar)
{
_socket.EndSend(ar);
}

MSDN 在 IAsyncResult 中也说:

AsyncWaitHandle: Gets a WaitHandle that is used to wait for an asynchronous operation to complete.

那么为什么我不能用它来达到这个目的呢?

谢谢。

最佳答案

不确定我是否正确理解了这个问题。但这是正常行为。 BeginSend 的意思是“如果必须的话,请异步执行此操作”。不必经常这样做。在许多情况下,发送可以同步完成,因为内核内存池中有足够的空间来存储字节。只需要非常快的内存到内存复制,重叠的 I/O 传输就会立即完成。

另一个很好的例子是 FileStream.BeginWrite(),它写入文件系统缓存。您通常必须写入超过 1 GB 的数据,然后才会填满缓存并开始花费时间。

无论如何,在这种情况下,WaitOne() 调用将立即返回并且不使用超时。陈雷刚blogged about this recently 。从 native API 的角度来看,但这就是这里所使用的。我认为您在这里没有遇到真正的问题,只是 Windows 工作效率很高。

关于.net - 为什么我不能使用 Socket.BeginSend 中的 WaitHandle 来等待操作完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3949520/

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