我的vb.net应用程序就像服务器(Echo),它允许客户端(另一个应用程序)向服务器查询不同类型的文档或其他文件。现在我面临的问题是,当应用程序(Server)是UP,它在单个线程上运行。但是当来自同一台机器或其他机器的客户端尝试连接到服务器进行查询时,应用程序启动另一个线程用于与服务器建立的连接.Hence,while调试服务器(VB.Net应用程序),我们发现从一个线程执行的操作的控制开关,该线程从服务器启动时开始到客户端连接到服务器时启动的另一个线程。但是我希望整个操作在服务器启动时启动的同一个线程上完成。
客户端尝试连接到服务器后启动的第二个线程是因为我们使用第三方控件名称Dart TCP进行服务器和客户端之间的连接,其中客户端连接到服务器,我们正在使用一个在 Initialize 方法中调用的方法,如下面的代码,当客户端连接时:
server.start(新的ConnectThreadStart(AddressOf connectionstart ),端口,状态)。 在这里, connectionstart 是启动连接的方法,对于服务器和客户端之间的通信是可用的,直到两者中的任何一个结束连接。
提供任何解决方案或想法将不胜感激。谢谢。
答案 0 :(得分:0)
如您所见,有一个新请求以新请求开始(这很好)。
使所有线程共享某些配置设置的一种(非常糟糕的)方法是使用线程安全变量来存储配置。当一个线程需要访问它时,它获取该变量的锁,读取或写入它,然后释放锁。
相当糟糕的部分是所有线程都依赖于一个单一资源 - 这可能使整个应用程序慢于nescessary - 一个请求可以锁定配置变量,而其他所有线程在需要读取时停止它。死锁。
虽然它可能足以进行调试。
有关在此处锁定资源的更多信息:http://support.microsoft.com/kb/816161
更好的事情(避免死锁)将使用不可变的数据结构,现在似乎可以通过NuGet ImmutableHashMap
获得