c#插座始终使用同一螺纹进行端接

c#插座始终使用同一螺纹进行端接,c#,multithreading,sockets,C#,Multithreading,Sockets,我使用MSDN async示例编写了一个异步套接字客户机和服务器类,3000 GB的数据在单客户机和单数据发送线程测试下全部成功传输。 但当我使用for循环创建几个线程来向服务器发送数据时,我发现在客户端,为BeginConnect回调创建的线程总是具有相同的id。 当第一个线程调用ManualResetEvent.Set()时,所有ManualResetEvent机制都失败,所有线程都激活。(每个线程都有自己的ManualResetEvent对象) 这是我的客户端日志示例:(问题是为什么总是线

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

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

15:33:05.100数据发送线程1,开始连接到服务器192.168.1.100 端口6000
15:33:05.100数据发送线程2,开始连接到服务器 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连接回调线程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

如果你对此感兴趣,我可以把源代码寄给你。 我的邮件在里面。harcon@gmail.com

为什么总是线程7执行EndConnect任务

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

如果要通知调用
BeginConnect
的线程,则需要向
BeginConnect
传递某些内容作为最后一个参数
对象状态
。例如,您可以传递相应的
ManualResetEvent
对象,然后从回调方法向其发送信号

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

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

不要邮寄源代码-张贴你所指的相关部分。