繁体   English   中英

与命名管道和WCF服务的进程间通信:线程问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM