- PR -

VS作成のWebサービスプロキシによる同期呼び出しとメッセージループ

1
投稿者投稿内容
DSCH
常連さん
会議室デビュー日: 2005/10/23
投稿数: 24
投稿日時: 2007-01-19 00:06
VisualStudio2003の環境でフォームアプリケーションから、
「Web参照の追加」で自動作成されたプロキシを通してWebサービスを同期呼び出ししています。

WindowsXPの場合、フォームがメッセージが一定時間処理しないとOSによってゴーストウィンドウ(「応答なし」と表示されるダミーのウィンドウ)が作成されますが、Webサービスの呼び出しではいくら時間がかかってもゴーストウィンドウが表示されませんでした。

そこでWndProcでコンソール出力したりspy++を使ってみると、Webサービス呼び出しの間も一部のメッセージが処理されていました。マウスクリックやマウスホイールは処理されませんがWM_ACTIVATEは処理されていました。
フォーム上で他のフォームを移動させてみると、再描画に関してもWM_PAINTは受け取っていませんが、WM_NCPAINTは受け取っていて、外側のフレームだけが再描画されました。

さらに興味深いことに、非常に短い時間で呼び出しが終わるWebサービスを使って
コード:
while(true)
{
// 一瞬で終わるWebサービスの同期呼び出し
Thread.Sleep(1000);
}


という処理を実行すると1秒に1回の割合でDoEventsメソッドを呼び出したような完全なメッセージ処理が行われました。

プロファイラでCLR内の論理スレッド数を調べてみたところ、起動時は3本あるスレッドがWebサービスの同期呼び出しをしたところで5本へ増加しました。

巷では「Webサービスを同期で呼び出すと同じスレッド上で実行されて云々」と書かれていますが、内部的には別スレッドを利用して同期呼び出しが行われているようです。実際にはどのように同期呼び出しが実現されているのか興味深いのですが、事情をご存知の方はいらっしゃいますでしょうか?
1

スキルアップ/キャリアアップ(JOB@IT)