【问题标题】:c# socket always EndConnection with the same thread [closed]c#socket总是EndConnection与同一个线程[关闭]
【发布时间】:2013-12-12 09:22:43
【问题描述】:

我使用 MSDN 异步示例编写了一个异步套接字客户端和服务器类,3000 GB 数据在单客户端和单数据发送线程测试下全部成功传输。 但是当我使用 for 循环创建多个线程向服务器发送数据时,我发现在客户端,为 BeginConnectCallback 创建的线程始终具有相同的 id。 并且所有 ManualResetEvent 机制都失败了,当第一个线程调用 ManualResetEvent.Set( ) 时,所有线程都被激活。 (每个线程都有自己的 ManualResetEvent 对象)

这是我的客户端日志示例:(问题是为什么线程 7 总是执行 EndConnect 工作?)

15:33:05.100 数据发送线程 1,BeginConnect 到服务器 192.168.1.100 端口 6000
15:33:05.100 数据发送线程 2,BeginConnect 到服务器 192.168.1.100 端口 6000
15:33:05.100 数据发送线程 3,开始连接到服务器 192.168.1.100 端口 6000
15:33:05.102 ConnectionCallback 线程 7 执行 EndConnect 和 mreConnectDone.Set( );
15:33:05.102 ConnectionCallback 线程 7 执行 EndConnect 和 mreConnectDone.Set( );
15:33:05.121 数据发送线程 1, 通过端口 2650 连接,套接字句柄:8234
15:33:05.145 ConnectionCallback 线程 7 执行 EndConnect 和 mreConnectDone.Set( );
15:33:05.170 数据发送线程 2,通过端口 2651 连接, 套接字句柄:8235
15:33:05.177 数据发送线程 3,已连接 通过端口 2652,套接字句柄:8236

如果您对此感兴趣,我可以将源代码邮寄给您。 我的邮件是 thlin.harcon@gmail.com

MSDN sample URL

【问题讨论】:

  • 不要邮寄源代码 - 发布您所指的相关部分。

标签: c# multithreading sockets


【解决方案1】:

为什么线程 7 总是做 EndConnect 工作?

ConnectCallback 方法由 .NET Framework 在线程池中的线程上调用。如果线程 7 在给定时刻没有被任何工作占用,则线程池管理器可能决定在该线程上运行回调。当所有回调都在该单个线程上执行时,这是线程池的正常行为。

如果你想通知调用BeginConnect 的线程,那么你需要将一些东西作为最后一个参数Object state 传递给BeginConnect。例如,您可以传递相应的ManualResetEvent 对象,然后从回调方法中发出信号。

顺便说一句,您提到的 MSDN 示例显示了如何在回调方法中检索 ManualResetEvent 对象(或您传递给 BeginConnect 的任何其他对象)的示例:

    // Retrieve the socket from the state object.
    Socket client = (Socket) ar.AsyncState;

【讨论】:

    猜你喜欢
    • 2012-03-22
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    相关资源
    最近更新 更多