我一直在研究MSDN上的Asynchronous Client和Asynchronous Server Socket示例,并愉快地完成了当一个客户端连接到一个服务器时可以完美工作的示例。我的问题是,我需要将大量工作与多台机器同步,以便它们几乎同时执行(就像毫秒差一样)。该操作相当简单,只需与子服务器(都运行在同一台机器上,但在不同的端口上进行初始测试)通信,模拟其处理过程,并向调用者发送一个“就绪”信号。一旦所有服务器都返回了此标志(或发生超时),第二条消息将从客户端传递到已确认的服务器,通知它们执行。
到目前为止,我的方法是创建两个存储在列表中的客户端实例,并通过循环遍历列表来启动例程。这工作得很好,但不是特别快,因为每个客户端的例程都是同步运行的。为了加快进程,我创建了一个新线程,并在该线程上为每个客户端执行例程。现在,这确实起作用了,允许两个或更多服务器返回并适当地同步。不幸的是,这非常容易出错,并且'ReceiveCallback‘方法下面一行中的'ObjectDisposedException’异常的代码错误...
// Read data from the remote device.
int bytesRead = client.EndReceive(ar);
通过一些调查和调试,我跟踪了传递给例程的套接字(使用它的句柄),发现虽然它没有连接,但总是第二个返回失败的套接字,而不是第一个成功读取其响应的套接字。此外,这些套接字实例(基于句柄值)看起来像是单独的实例,但不知何故,第二个(以及后续响应)继续在该行上出错。
是什么导致这些套接字在被合法处理之前不适当地自行处置?由于它们在单独的线程中运行,并且没有共享例程,第一个套接字是否在其他实例上被不适当地使用?Tbh,我感觉有点迷茫,虽然我可以包扎这些错误,但代码的可靠性和潜在的丢失返回确认并不是一个有利的目标。有什么建议吗?
亲切的问候
发布于 2011-11-29 11:46:33
原来共享/静态ManualResetEvent是跨不同的实例设置的,所以线程1将设置ManualResetEvent,在第二个线程上处理套接字。通过确保没有共享/静态的方法/属性-每个线程和套接字都将在其自己的作用域中执行。
https://stackoverflow.com/questions/8298297
复制