[英]Inter-process communication with named pipe and WCF Service: threading issue
我有两个过程:一个GUI,另一个CUI。 它们每个都承载一个简单的WCF服务,并且它们通过名称管道相互通信。
GUI应用程序中有两个按钮和一个进度栏。
“开始运行”按钮告诉CUI运行任务30秒钟。 CUI将其进度报告回GUI,因此可以更新进度栏。 “打印”按钮告诉CUI打印字符串。
现在,如果我们按几次“打印”按钮,就可以了,CUI将打印字符串:
然后,如果我按下“开始运行”按钮,CUI会将进度打印到控制台,并将进度报告回GUI并更新进度条:
然后,我可以再按几次“打印”按钮,它可以工作:
这一切似乎都很好。
但是,如果我重新启动这两个进程,然后先单击“开始运行”按钮,然后单击“打印”按钮,则这两个进程将被冻结:
它看起来像一个线程问题。
因此,似乎如果我先单击“打印”按钮,则一切正常。 但是,如果我首先单击“开始运行”按钮,则将出现死锁。 这是为什么?
您可以从以下位置下载此示例: http : //files.cnblogs.com/cuipengfei/SampleForStackOverflow.zip
当您调用worker.Print()时,会出现死锁,因为它不会为worker创建新对象,而是尝试重用同一对象。 如果将该调用放在另一个线程中,则可以看到一旦worker.RunTask(30)完成,便会执行此调用。
首先,我想将InstanceContextMode.Single更改为InstanceContextMode.PerCall,因此它为每个调用创建一个对象,而不是对所有调用使用相同的对象。 这不能解决问题。
重新测试提供的案例研究,如果您完成worker.RunTask(30),它也将起作用。 因此,如果您在调用第二个呼叫之前从未完成呼叫,那么我认为会出现问题。 然后,它尝试重用同一服务器实例。 完全完成一个呼叫后,它将按预期工作。
但是,解决您的问题的方法是打开与服务器的多个连接:
NetNamedPipeBinding binding2 = new NetNamedPipeBinding();
worker2 = ChannelFactory<IWorker>.CreateChannel(binding2, endpointAddress);
然后使用它来访问打印操作:
worker2.Print();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.