【发布时间】:2014-09-12 06:16:38
【问题描述】:
我注意到下面链接的异步套接字发送和接收表单 MSDN 的示例不起作用。发生的情况是,在使用 BeginReceive 在 Receive 中创建的线程直到在 StartClient 方法上运行的线程退出该方法时才会启动。因此,receiveDone.WaitOne() 事件永远不会被调用,因为 Receive 方法中的信号器永远不会被击中,因为 beginReceive 创建的工作线程在 StartClient 方法返回之前不会启动。
我还看到网上有很多关于这个问题的参考资料。
有人对这个问题有什么想法吗?
http://msdn.microsoft.com/en-us/library/fx6588te(v=vs.110).aspx
【问题讨论】:
-
我不明白这个问题,我以为这是在异步套接字中...为什么它被标记为
ThreadPool? -
在调用 BeginReceive() 的方法完成后,它将开始长时间运行,long。网络连接比处理器慢得多。如果您使用调试器,甚至更长。这是异步套接字的重点,你永远不想等待它。如果回调永远不会运行,那么你做错了。可能是通过尝试连接到没有响应或被防火墙阻止的机器。
-
@Aron:我用 ThreadPool 标记了这个问题,因为我无法解释这种行为,就像 threadPool 用完了线程并且在线程可用之前不允许 beginReceive 启动。但这很可能不是这种情况,因为在进行此调用时只使用了大约 8 个线程。
-
@Hans:感谢您的评论,但这是针对我 14 年前编写的服务器,并且在生产中运行没有任何问题。唯一的问题是,在更新客户端应用程序时,我决定使用 .NET 异步方法并遇到了这个问题。具体问题是,在 MS 的这个示例中,beginRead 将不会调用 AsyncCallback,直到方法 startClient 返回,无论我等待多长时间,如果我在调试器中或其他情况下。这就像 AsyncCallback 线程加入了运行 startClient 方法的线程。
-
@KarlEasterly 这是否发生在来自 MSDN 的完全相同的代码中,都在单独的控制台应用程序中?另外,请注意该示例缺少对同步完成操作的检查 - 如果从
BeginXXX返回的IAsyncResult设置了CompletedSynchronously,则不会调用回调 - 您必须自己调用它。这在网络上不太可能发生,但如果您在 localhost 上进行测试,它可能会发生,尤其是在涉及所有等待的情况下。
标签: .net multithreading sockets threadpool asyncsocket