質問に使用したVisualStudioのソリューションファイル一式は以下のgithubに公開しております。
cloneして、slnを開いてコンパイルしexeを二つ実行すると即再現出来るかと思います。
https://github.com/fushihara/cs-ipc-message-question
wpfアプリケーションでIPC通信を行いたいと思い、以下のCLIアプリでのサンプルをwpfで動くように改造しています。
https://code.msdn.microsoft.com/windowsdesktop/IPC-917071bc/view/Discussions#content
上記サイトのコードの中身は、アプリ起動時にMutexを取得。取得成功したらIPCサーバーとしてクライアントの接続を待機。
アプリ起動後にMutexの取得に失敗したらクライアントとして前述のIPCサーバーに接続し、クライアント側からサーバー側にメッセージを送信する。 という内容です。
MSDN上にあるcliのコードは問題なく動いています。
この処理をwpfアプリで使おうと思い、簡単なGUIを作って上記コードのロジックを移植してみました。
cs
1this.ipc = new IpcMessageSender<string>("sample", "sample"); 2if (ipc.IsCadet) { 3 var result = ipc.SendMessage(string.Format("{0:HH時mm分ss秒}です。後続プロセスが起動しました。", DateTime.Now)); 4} else { 5 // IPCでオブジェクトを受信したとき発生します。 6 ipc.MessageReceived += (a, b) => { 7 this.addLog($"受信[{b.Message}]"); 8 return "受信しました(ホストより)"; 9 }; 10}
IPCの処理としてはインスタンスを作る、ifでサーバーとクライアントを分岐する。サーバーの場合はメッセージ受信時のイベントをセットする。クライアントの時はサーバーにメッセージを送る。だけです。
このコードを実行すると、一回目の起動 つまりサーバー側としての起動は問題なく立ち上がりますが、一回目の起動をしたまま二回目の起動 つまりクライアント側としての起動時、SendMessageを呼ぶ時に下記のようなエラーが出てしまいます。
wpfのテキストフォームであれば非UIスレッドからは操作できないと分かるのですが、イベントが別スレッドから操作出来ないというのは、どのように解決したらよいのでしょうか。
質問内容が具体的でなく申し訳ありませんが、よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/29 05:24