2012-02-17 9 views
1

私は2つのプロセスを持っています:1つはGUI、もう1つはCUIです。 それぞれは単純なWCFサービスをホストし、ネームパイプを介して相互に通信します。名前付きパイプとWCFサービスとのプロセス間通信:スレッドの発行

GUIアプリケーションには2つのボタンとプログレスバーがあります。 enter image description here

「実行開始」ボタンは、30秒間タスクを実行するようにCUIに指示します。 CUIはその進捗状況をGUIに報告し、プログレスバーを更新することができます。 「印刷」ボタンは、文字列を印刷するようにCUIに指示します。

今、私たちは数回のために、「印刷」ボタンを押すと、それは大丈夫です、CUIは、文字列を出力します: enter image description here

私はボタン「実行を開始」を押すと、次に、CUIは、進捗状況を表示しますコンソールへと戻ってGUIに進捗状況を報告し、プログレスバーが更新されます: enter image description here

をそれから私は、カップルのためのより多くの時間を「印刷」ボタンを押すことができ、それが動作します: enter image description here

これはすべて良いようです。

しかし、私は、これらの二つのプロセスを再起動して、最初の「実行開始」ボタンをクリックすると、「印刷」ボタン、そして両方のプロセスが凍結されますクリックしてください: enter image description here

これは、スレッドの問題のように見えますが。

私は印刷ボタンをクリックして始めると、すべてが機能しているようです。 しかし、私がスタート・ランニング・ボタンをクリックすると、デッド・ロックが発生します。 なぜですか?

ここからこのサンプルをダウンロードすることができます。http://files.cnblogs.com/cuipengfei/SampleForStackOverflow.zip

答えて

1

デッドロックは、それが労働者のための新しいオブジェクトを作成しないよう、あなたがworker.Print()を呼び出しているときに表示されますが、同じものを再利用しよう。その呼び出しを別のスレッドに入れた場合、worker.RunTask(30)が終了するとこの呼び出しが実行されることがわかります。

最初に、InstanceContextMode.SingleをInstanceContextMode.PerCallに変更することを考えていたので、すべての呼び出しで同じオブジェクトを使用するのではなく、呼び出しごとに1つのオブジェクトを作成します。これで問題は解決されませんでした。

用意されたケーススタディを再テストします。これは、worker.RunTask(30)を終了させる場合にも機能します。だから私は問題が発生したと思う、あなたは2番目の呼び出しを呼び出す前に呼び出しを完了していない場合。次に、同じサーバーインスタンスを再利用しようとします。 1回の通話が完了すると、期待どおりに動作します。

しかし、あなたの問題は、サーバーに複数の接続を開くことです解決するもの:

NetNamedPipeBinding binding2 = new NetNamedPipeBinding(); 
worker2 = ChannelFactory<IWorker>.CreateChannel(binding2, endpointAddress); 

そして、印刷操作をアクセスするためにこれを使用します。

worker2.Print(); 
+0

おかげで、複数の接続工事を開きます。ちなみに – CuiPengFei

+0

では、別のスレッドでタスクを実行することでこの問題を解決することもできます。 – CuiPengFei