C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: IPCでのプロセス間通信でクライアント側の画面が固まる


(過去ログ 98 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■58342 / inTopicNo.1)  IPCでのプロセス間通信でクライアント側の画面が固まる
  
□投稿者/ IIIU (1回)-(2011/03/31(Thu) 11:14:18)

分類:[C#] 

はじめまして、IIIUと申します。

早速本題に入らせていただきます。

現在、C#.netのWindowsFormアプリでデータサーバへのデータ転送処理を別プロセスに分割しようとしておりまして、
クライアントプロセス(元のプロセス)からサーバプロセス(分割したプロセス)に対してIPCを使用したプロセス間通信で
データ転送要求を行いサーバプロセス側からデータサーバへデータ転送を行っております。

その際ですが、データ転送要求を行ってからサーバプロセス側でデータサーバへデータ転送が完了するまでクライアントプロセスの画面が固まる(操作できない)状態になります。
データ転送要求を行ったらクライアントプロセス側は画面の制御ができるようにしたいのですが、
プロセス実行の優先度等でそのような状態になるものなのでしょうか?

原因としては下記のように考えているのですがよくつかめておりません・・・
大雑把な質問の仕方で申し訳ありませんが、アドバイスをいただけないでしょうか?
■原因として考えていた内容
・サーバプロセス側のプロセス間通信データ受信イベント内で
 時間のかかるデータサーバへの転送処理が別スレッド化されていないかスレッドセーフになっている?
→デリゲートのBeginInvokeメソッドでデータサーバへのデータ処理を呼び出しているので非同期スレッドになっていそうです・・・


データ転送までの流れとしては、
1. クライアントプロセスの送信ボタンを押下
2. クライアントプロセスのデータ送信メソッドが実行され、
  このメソッド内でサーバプロセスへデータ送信要求を送信
3. サーバプロセスはクライアント側へデータの受領したことを送信し、
  データサーバへのデータ転送を開始
4. クライアントプロセスはデータ送信メソッド終了後にDBへのデータ更新と画面更新を行う
  ↑デバックしてみるとここでサーバプロセス上でデータサーバへデータ転送が終了するまで
   クライアント側の処理が実行されていないように見えます

※サーバプロセスのデータサーバへのデータ転送は別スレッドで実行しており、
 デバッグ実行で確認したところ、データサーバへのデータ転送が完了する前にクライアントプロセスのデータ転送メソッド
 から戻り値が取得できているため、単純に別スレッドになっていないからという理由ではないとは思います。

また、IPCのコードとしては下記サイト様のソースを参考にしており、
送信データの項目が増えた以外には同じ処理です。
http://gurizuri0505.halfmoon.jp/develop/csharp/processmessage
引用返信 編集キー/
■58347 / inTopicNo.2)  Re[1]: IPCでのプロセス間通信でクライアント側の画面が固まる
□投稿者/ shu (592回)-(2011/03/31(Thu) 11:48:33)
No58342 (IIIU さん) に返信

改善されるか分かりませんがBackgroundWorker を使用してみてはどうででしょう?
引用返信 編集キー/
■58352 / inTopicNo.3)  Re[2]: IPCでのプロセス間通信でクライアント側の画面が固まる
□投稿者/ IIIU (2回)-(2011/03/31(Thu) 13:23:30)
No58347 (shu さん) に返信
> ■No58342 (IIIU さん) に返信
>
> 改善されるか分かりませんがBackgroundWorker を使用してみてはどうででしょう?
引用返信 編集キー/
■58354 / inTopicNo.4)  Re[3]: IPCでのプロセス間通信でクライアント側の画面が固まる
□投稿者/ IIIU (3回)-(2011/03/31(Thu) 13:25:59)
No58352 (IIIU さん) に返信
shu様アドバイスありがとうございます、
一応サーバプロセスのデータサーバ転送処理をBackgroundWorkerで実行してみましたが、
動作的には同じでした。

今からクライアントプロセス側でも試してみます。

> ■No58347 (shu さん) に返信
>>■No58342 (IIIU さん) に返信
>>
>>改善されるか分かりませんがBackgroundWorker を使用してみてはどうででしょう?
引用返信 編集キー/
■58386 / inTopicNo.5)  Re[4]: IPCでのプロセス間通信でクライアント側の画面が固まる
□投稿者/ Azulean (723回)-(2011/03/31(Thu) 22:49:52)
No58354 (IIIU さん) に返信
> 一応サーバプロセスのデータサーバ転送処理をBackgroundWorkerで実行してみましたが、
> 動作的には同じでした。

クライアントはサーバーの応答を待っているわけですから、サーバー側をその応答をいち早く返すか、クライアント側が応答を待たない or 非同期で待つようにすることが必要でしょう。
従って、サーバー側に BackgroundWorker を適用しても変化はないとみられます。

> 今からクライアントプロセス側でも試してみます。

クライアント側で非同期で待つ間、ほかのユーザーインターフェースなどが使えるようになるかもしれません。あるいは、サーバーからのデータが来ている前提のコードが動くかもしれません。
メインスレッドが動いていても、大丈夫なようにきちんと設計してください。
引用返信 編集キー/
■58418 / inTopicNo.6)  Re[5]: IPCでのプロセス間通信でクライアント側の画面が固まる
□投稿者/ PATIO (107回)-(2011/04/04(Mon) 13:47:19)
Azuleanさんが書かれているようにクライアント側の処理が同期になっているのでは
ないかなと言うのが正直な所ですね。

サーバー側の処理の結果が出るまでクライアントが待たされていると言う話だと思います。
クライアント側がサーバー側に要求を出した時にサーバー側は要求を受け付けた旨のみを
クライアント側に結果として返却してクライアント側の応答待ちを回避するか、
クライアント側の通信部分をワーカースレッドにでもしてGUI制御を行なっているメインスレッド
から切り離すかしないとクライアント側が通信待ちから開放されないと思います。

非同期にするのであれば、サーバー側の処理が終わったときの結果をどうやって取り込むのか
に関しては別途考える必要が出てきますね。結果が出るまで待っていれば、その続きで処理が
できますけれど、非同期になると結果が出た時にクライアントがどんな状態になっているかは
クライアントの設計次第(何処までユーザーの操作を許すか)によると思います。
この辺の動作に矛盾が起きないように設計する必要があると思います。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -