问题标签 [io-completion-ports]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - c#并行IO完成端口
我试图找出等待一些 I/O 完成端口完成的最佳方法。
对于这种情况,假设我在 MVC3 Web 应用程序中。(我的理解是这里推荐使用 I/O Completion 端口,这样我就可以将原来的线程返回给 IIS 来服务其他请求)
假设我有一个 ID 数组,我想从某个网络调用中为每个 ID 获取一个对象。
并行化这种同步方法的最佳方法是什么?
我知道它会这样开始:
我应该使用DataServiceContext.BeginExecute方法吗? DataServiceContext.BeginExecuteBatch?我正在使用的数据服务一次只能获取一条记录(这超出了我的控制范围),我希望这些单独的查询并行运行。
winapi - 如何使用 BindIoCompletionCallback 检测 WinSock TCP 超时
我正在使用 BindIoCompletionCallback 构建一个 Visual C++ WinSock TCP 服务器,它可以正常接收和发送数据,但我找不到检测超时的好方法:SetSockOpt/SO_RCVTIMEO/SO_SNDTIMEO 对非阻塞套接字没有影响,如果对等方不是发送任何数据时,根本不会调用 CompletionRoutine。
我正在考虑将 RegisterWaitForSingleObject 与 OVERLAPPED 的 hEvent 字段一起使用,这可能会起作用,但是根本不需要 CompletionRoutine,我还在使用 IOCP 吗?如果我只使用 RegisterWaitForSingleObject 而不使用 BindIoCompletionCallback 是否存在性能问题?
更新:代码示例:
我的第一次尝试:
正如我所说,如果客户端实际上正在向我发送数据,它工作正常,“接收”没有阻塞,调用 CompletionRoutine,接收到数据,但这里有一个问题,如果客户端没有向我发送任何数据,怎么能超时后我放弃了?
由于 SetSockOpt/SO_RCVTIMEO/SO_SNDTIMEO 在这里无济于事,我想我应该使用 OVERLAPPED 结构中的 hEvent 字段,该字段将在 IO 完成时发出信号,但是 WaitForSingleObject / WSAWaitForMultipleEvents 将阻止接收调用,我希望接收总是立即返回,所以我使用了 RegisterWaitForSingleObject 和 WAITORTIMERCALLBACK。它起作用了,在超时后调用回调,或者 IO 完成,但现在我有两个回调用于任何单个 IO 操作,CompletionRoutine 和 WaitOrTimerCallback:
如果 IO 完成,它们将被同时调用,如果 IO 未完成,WaitOrTimerCallback 将被调用,然后我调用 CancelIoEx,这导致 CompletionRoutine 被调用并出现一些 ABORTED 错误,但这是一个竞争条件,可能是 IO将在我取消它之前完成,然后...... blahblah,总而言之相当复杂。
然后我意识到我实际上根本不需要 BindIoCompletionCallback 和 CompletionRoutine,并且从 WaitOrTimerCallback 做所有事情,它可能会工作,但这是一个有趣的问题,我想首先构建一个基于 IOCP 的 Winsock 服务器,并认为 BindIoCompletionCallback 是最简单的方法是使用 Windows 本身提供的线程池,现在我最终得到一个没有 IOCP 代码的服务器?还是 IOCP 吗?还是我应该忘记 BindIoCompletionCallback 并构建自己的 IOCP 线程池实现?为什么 ?
windows - CloseHandle() 在串口实际关闭之前返回
我正在拉扯我的头发,试图弄清楚串行端口何时完成关闭,以便我可以重新打开它。事实证明,CloseHandle()
在端口实际解锁之前返回。
我正在使用 打开一个串行端口CreateFile(FILE_FLAG_OVERLAPPED)
,使用 将其与 CompletionPort 关联,使用CreateIoCompletionPort()
读取/写入它ReadFile()
,WriteFile()
并使用 关闭它CloseHandle()
。
我注意到,如果我足够快地关闭并重新打开串行端口,我会ERROR_ACCESS_DENIED
从CreateFile()
. 尽管我正在等待CloseHandle()
返回,然后等待与该句柄关联的所有未完成的读/写操作从完成端口返回,但这种情况仍在发生。当然有更好的方法:)
如何同步关闭串口?请不要重试循环、sleep() 或其他一些廉价的黑客。
编辑:也许这与我使用完成端口和 FILE_FLAG_OVERLAPPED 有关。当读/写操作完成时,我会收到一个回调。端口关闭是否有某种回调?
c++ - WSARecv,Completionport Model,如何管理Buffer,避免溢出?
我的问题:我的 Completionport 服务器将从不同的客户端接收未知大小的数据,问题是,我不知道如何避免缓冲区溢出/如何避免我的(接收)缓冲区被数据“过度填充”。
现在到问题:1)如果我通过 WSARecv 进行接收呼叫,工作线程是否像回调函数一样工作?我的意思是,它是仅在完成后才挖掘接收呼叫,还是在接收发生时也挖掘它?lpNumberOfBytes(来自 GetQueuedCompletionStatus)变量是否包含到目前为止接收到的字节数或接收到的总字节数?
2)如何避免溢出,我想到了动态分配的缓冲区结构,但话又说回来,我如何找出包会有多大?
编辑:我不想问这个,但是有没有“简单”的方法来管理缓冲区并避免溢出?同步听起来对我来说是无限的,至少现在
c - 带有 IO 完成端口问题的 WriteFile
我有这段代码,它基本上使用 IO 完成端口写入文件 5 次。正如您所猜测的那样,它的效果不是很好。问题是我希望将“hello”写入文件 5 次,但最终总是只写入一个“hello”。我很困惑,因为程序打印了 5 次“写了 5 个字节”,所以我假设写操作正常。
任何人都可以看到这个问题吗?
c# - SocketAsyncEventArgs 缓冲区已满零
我正在为我的分布式系统编写消息层。我正在使用 IOCP,即 Socket.XXXAsync 方法。
这与我正在做的事情非常接近(事实上,我的接收功能是基于他的):http: //vadmyst.blogspot.com/2008/05/sample-code-for-tcp-server-using.html
我现在发现的是,在程序开始时(两个测试服务器相互通信)我每次都会得到一些 SAEA 对象,其中 .Buffer 完全用零填充,但 .BytesTransferred 的大小是缓冲区(在我的情况下为 1024)。
这是什么意思?我需要检查什么特殊情况吗?我的系统将此解释为一条不完整的消息并继续前进,但我想知道我是否真的遗漏了一些数据。我的印象是,如果没有收到任何内容,您将不会收到回电。无论如何,我可以在 WireShark 中看到没有任何零长度数据包进入。
我在谷歌上找到了以下内容,但我不确定我的问题是否相同: http ://social.msdn.microsoft.com/Forums/en-US/ncl/thread/40fe397c-b1da-428e -a355-ee5a6b0b4d2c
http://go4answers.webhost4life.com/Example/socketasynceventargs-buffer-not-ready-121918.aspx
c# - 将多个文件关联到同一个 io 完成端口,同时保持文件流顺序 c#
我需要将从另一个进程发送给我的对象写入磁盘上的多个文件。每个对象都带有 fileID(要写入的文件的名称)和数据块。
我想使用 IO 完成端口 (IOCP) 来优化文件写入,使用并发异步 I/O,但我必须同步写入每个文件,例如我必须在写入时保持每个文件的块顺序磁盘但不是文件顺序。
我了解 .Net 在执行 IO 操作时使用 IOCP,但我如何让它按我想要的方式工作?
c++ - IO 完成端口 - 发送还是接收?
如果我编写了一个使用 IO Completion Ports 使用非阻塞套接字进行多路复用的程序,那么当 getQueuedCompletionStatus 返回时,我怎么知道在套接字上执行的函数是 send 还是 recv 呢?
提前致谢 :)
c# - 在 C# 中的有限线程池上使用来自多个套接字的 IO 完成端口
我正在尝试侦听来自各种传入端口(~20)的 UDP 数据包。我想用大约 3-5 个线程来接收和处理这些数据包。这似乎是 Windows 中 IO 完成端口的理想情况。我不明白的是如何对多个套接字进行多到少的映射以检查一组较小的线程。
以下代码创建我的所有套接字并开始异步接收操作。
我知道收到数据包时将调用每个 OnReceive 消息...
- 如何限制运行 OnReceive 事件的线程数?
- 在 OnReceive 方法递归调用自身太多次的极少数情况下,防止堆栈溢出的最佳方法是什么?
c++ - I/O 完成端口上的多个线程
我正在使用 I/O 完成端口开发 C++ 套接字服务器。我按照一些文章的建议为每个处理器创建一个 I/O 端口和两个工作线程,以处理重叠的 I/O 活动
从我所读到的,只有这些工作线程中的一个应该随时唤醒并处理 I/O 请求。因此,当一个客户端(仅)连接并发送某些内容时,我所期望的只是一个线程唤醒并处理该接收,但是当我尝试调试它时,我可以看到多个线程唤醒并尝试处理相同的操作。
我的假设是错误的吗?