2011-11-28 74 views
1

我一直在寻找MSDN上的Asynchronous ClientAsynchronous Server Socket示例,并且愉快地打出了一个客户端连接到一个服务器时可以完美工作的示例。我的问题是我需要将大量工作与大量机器同步,以便它们几乎同时执行(如毫秒差异)。该操作相当简单,与子服务器(全部运行在同一台计算机上但在不同端口上进行初始测试)交谈,模拟其处理并将“就绪”信号发送回主叫方。一旦所有的服务器都返回了这个标志(或发生超时),从客户端传递给确认服务器的第二条消息告诉它们执行。将多个异步客户端应用到多个服务器时发生ObjectDisposedException

到目前为止,我的做法是创建两个客户端实例,存储在列表中,并通过循环列表来启动例程。这很有效,但并不是特别快,因为每个客户端的例程都是同步运行的。为了加速这个过程,我创建了一个新的线程并为每个客户端执行该例程。现在,这可以让两个或更多服务器返回并适当地进行同步。不幸的是,这是很容易出错,并在下一行的“ReceiveCallback”方法“的ObjectDisposedException”异常的代码错误...

// Read data from the remote device. 
int bytesRead = client.EndReceive(ar); 

随着一些调查和调试跟踪我的插座被传递到例程(使用它的句柄)并在没有连接时找到,它总是第二个返回失败的套接字,而不是第一个成功读取其响应的套接字。另外,这些套接字实例(基于句柄值)似乎是单独的实例,但不知何故,第二个(以及后续的响应)在这一行上继续出错。

什么导致这些套接字在被合法地处理之前不恰当地处置自己?由于它们在单独的线程中运行并且没有共享例程,因此第一个套接字在其他实例上被不恰当地使用了吗? Tbh,我觉得在海上有点失落,虽然我可以帮助解决这些错误,但代码的可靠性和可能丢失回复确认并不是有利的目标。任何指针?

亲切的问候

+0

行 - 钉了它。但我并不完全确定我有100%密封的解释,但我通过确保方法不再是静态的以及ManualResetEvent标志来解决错误。 Tbh我认为套接字代码会匿名访问这些方法,'private'关键字将确保范围 - 不知何故,情况并非如此。 Anyhoo - 解决它,如果有些困惑... – SeanCocteau

回答

1

原来的共享/静态ManualResetEvent的是被设置在不同的实例,因此线程1将设置ManualResetEvent的布置所述第二线程上的插座。通过确保没有方法/属性被共享/静态 - 每个线程和套接字将在其自己的范围内执行。

相关问题