【发布时间】:2011-11-06 08:07:14
【问题描述】:
我似乎无法在任何地方找到明确的答案。
在客户端,如果我正在编写代码来处理来自服务器的回调方法,这是在 IOCP 线程上执行的吗?如果是,我希望我们应该保持该回调方法的实现高效且快速。如果需要进行任何阻塞调用,那么将回调响应排队到线程池是有意义的。
有人可以在这里确认/否认我的假设吗?
谢谢。
【问题讨论】:
标签: c# .net multithreading wcf
我似乎无法在任何地方找到明确的答案。
在客户端,如果我正在编写代码来处理来自服务器的回调方法,这是在 IOCP 线程上执行的吗?如果是,我希望我们应该保持该回调方法的实现高效且快速。如果需要进行任何阻塞调用,那么将回调响应排队到线程池是有意义的。
有人可以在这里确认/否认我的假设吗?
谢谢。
【问题讨论】:
标签: c# .net multithreading wcf
如果您在服务器中使用 IO 完成端口(例如,可能在需要模拟 1000 个客户端的服务器测试系统上),那么您有责任提升用户空间线程池以等待完成端口。这个池可以足够大以容纳许多客户端,因此可以避免第二阶段排队到另一个线程池。
如果您使用重叠的 IO 完成回调,则该回调由发出 ReadFileEx 的同一线程执行(假设您的线程正确等待警报等待(blahEx 调用),这允许 APC 回调)。如果该线程正在处理多个客户端,那么是的,该线程可能会很忙,您应该将缓冲区/套接字/上下文/任何内容排队到可以处理缓冲区并发出任何回复的线程池中。
【讨论】:
据我了解,是的,它在 IOCP 上。我认为由于服务器本身处于 IOCP 的中间(因为它正在调用您的回调),并且由于客户端处于 IOCP 的中间,所以最好尽快离开那里。
我遇到了同样的问题,我认为回调主要用作“事件”,通常被卸载到 UI 线程或不同的工作 Q。
【讨论】: