C# 在单元测试下运行ZeroMQ-地址已在使用中

C# 在单元测试下运行ZeroMQ-地址已在使用中,c#,.net,visual-studio,nunit,zeromq,C#,.net,Visual Studio,Nunit,Zeromq,我正在尝试使用TCP协议运行两个测试中的ZeroMQ REQ/REP端点。第一个测试执行得很好。然后释放端点(通过调用套接字和上下文上的Dispose()),但是第二个测试(使用相同的TCP端点地址)失败,异常为“地址已在使用”。为什么插座没有正确处理 对我来说,这听起来像是一个并发错误-好像网络堆栈或ZeroMQ没有足够快地清理它的资源,以便下次单元测试再次分配它们 如果你在两次测试之间小睡一会儿会怎么样?(我不喜欢这种解决方案,但用于调试…) 一个简单的潜在解决方案是为不同的测试使用不同的端

我正在尝试使用TCP协议运行两个测试中的ZeroMQ REQ/REP端点。第一个测试执行得很好。然后释放端点(通过调用套接字和上下文上的Dispose()),但是第二个测试(使用相同的TCP端点地址)失败,异常为“地址已在使用”。为什么插座没有正确处理

对我来说,这听起来像是一个并发错误-好像网络堆栈或ZeroMQ没有足够快地清理它的资源,以便下次单元测试再次分配它们

如果你在两次测试之间小睡一会儿会怎么样?(我不喜欢这种解决方案,但用于调试…)


一个简单的潜在解决方案是为不同的测试使用不同的端口。

我在单元测试中也得到了这一点。为了解决这个问题,我在套接字关闭后进行了10毫秒的睡眠(我正在重用上下文并执行inproc套接字)

如果没有睡眠,我会遇到已经在使用的问题。ZMQ在一个单独的线程上运行套接字,因此假设即使使用inproc,在重用地址以允许套接字线程关闭之前,您也需要一个上下文开关


我感到惊讶的是,如果您正确地关闭了上下文,那么错误仍然存在,因为您希望等待套接字线程完成,确保释放地址。您可能需要查看libzmq源代码以了解详细情况。

我试过了,但没有骰子-我在线程上睡了5秒钟。有趣的是,如果我在debug下运行,则没有问题,而且我可以使用不同的端口进行不同的测试,但我担心在尝试恢复服务时,可能发现了一些可能会在实时环境中影响我的东西。。