- - PR -
Webサービスの呼び出し中にカーソルを砂時計にする
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-10-16 09:22
いつもお世話になっております。
VB.NETで作成したクライアントからWebサービスを呼び出している間に、カーソルを砂時計にしたいのですが、できなくて困っています。 呼び出す前に Cursor = Cursors.WaitCursor を実行しているのですが、呼び出している間は、デフォルトのカーソルに戻ってしまいます。 何か解決方法をご存知であれば、教えていただけないでしょうか? | ||||
|
投稿日時: 2005-10-16 15:02
こんにちは。
クライアントというのは、Windows フォームと考えてよろしいですね? 試してみましたが、呼び出し中は砂時計になっています。 どのように行っていますか? | ||||
|
投稿日時: 2005-10-16 15:42
囚人さん、返信ありがとうございます。
今、以下のようなコードで行っています。 <クライアントアプリ> Dim Service As New localhost.Service1 Dim Message As String ' 砂時計にして画面を使用不可にする Cursor = Cursors.WaitCursor Me.Enabled = False ' WebサービスをCallする Message = Service.HelloWorld1 ' カーソルを元にもどして画面を使用可能にする Me.Enabled = True Cursor = Cursors.Default MessageBox.Show(Message) <Webサービス> <WebMethod()> _ Public Function HelloWorld1() As String System.Threading.Thread.Sleep(5000) Return "Hello World" End Function 再度確認してみたところ、画面のEnabledプロパティをFalseにしていた為、発生していたことが分かりました。 ただ、カーソルを砂時計にすることも画面にロックをかけることも、両方実現したいと考えております。 何かよい方法があれば、よろしくご教授お願いします。 | ||||
|
投稿日時: 2005-10-16 15:52
処理中は処理中メッセージを表示するダイアログを出しておくとか。 | ||||
|
投稿日時: 2005-10-16 15:58
ん〜、Enabled を False にしてもできますねぇ。
自分の環境が VS2003 を消してしまって、VS2005 でしか試せないので、もしやそれのせい…? 違いはないと思うんですけども。(バグでない限り) 5秒待っているみたいですから、速過ぎて勘違いってのもなさそうですしね。 他に何か情報ないですか? | ||||
|
投稿日時: 2005-10-16 16:35
Hongliangさん、囚人さん、ありがとうございます。
開発環境は、OSがWinXP SP2、VSはVS2003を使用しています。 Webサービスが稼動しているサーバは、Win2003Server、WinXP SP2の2つの環境 で実行してみましたが結果は同じでした。 関係ないかもしれませんが、IISの設定も特に変更していません。 やはり、VSが原因なのでしょうか? できれば、カーソルを砂時計にして、処理中であるという事にしたかったのですが、Hongliangさんが仰るとおり、処理中メッセージのダイアログを表示することも検討したいと思います。 | ||||
|
投稿日時: 2005-10-16 16:47
VS というより、.NET のバージョンが違うから?もしや、IIS ではなく、ASP.NET開発サーバーだから? ま、そんなわけないと思いますが^^; 代案を検討されるようなので…。 あまりにWebサービス側での時間がかかるようでしたら、非同期呼び出しを検討されてはどうでしょうか(少し面倒になりますが)。 Form を無効にするというのはありにしても、何も操作できなくなる(止まってしまう)というのは不味くないですか? #追記 処理中ダイアログを出す、と同じですね…。失礼しました。 [ メッセージ編集済み 編集者: 囚人 編集日時 2005-10-16 16:49 ] | ||||
|
投稿日時: 2005-10-16 17:20
以下は推測です。
.NET Framework上ではCursorプロパティを変更すると言う単純な処理ですが、APIレベルではWM_SETCURSORイベントをアプリケーションが処理し、表示したいカーソルのハンドを返すことで実現されます。したがってUIスレッドでメッセージポンプが働いていないと、マウスカーソルを変更することは出来ません。 UIスレッド内で時間のかかる処理を行っているため(あるいはWEBサービスクライアント側の内部実装の都合か?)により、WM_SETCURSORが正しく処理されていないのだろうと思われます。WM_SETCURSORの発生するタイミングは環境によって若干異なるでしょう。したがって、OSのバージョンや、WEBサービスを呼び出すタイミング、その他の環境の影響で再現したり、しなかったりしているのではないでしょうか? 確実に表示したいのでしたら、非同期に呼び出すか、UIとは別のスレッドで呼び出すのが良いと思います。 |