- - PR -
非同期メソッドのコールバックからタイマーの起動
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2003-10-06 11:18
こんにちは。半年になりますがまだまだ初心者です。お願いします。
現在WEBサービスを使用したWindowsアプリケーションを作成しております。 非同期メソッドのコールバックデリゲート内でWEBサービスメソッドを呼び出して、WEBサービス(IIS・サーバ)が停止してた場合にはメッセージを表示させて、サーバが復旧したメッセージを消すようにしたいと思ってます。 その仕組みとして、応答が無かったらTimerを使って5秒間隔でサーバの稼動チェックタイマーを起動させるようにしました。 でもコールバックメソッド内でMe.Timer1.Enable = True としてもタイマーが有効になりません。 コールバックメソッドからタイマーを呼び出すには何か特殊な事をする必要がありますか? 教えてください。 Delegate Function MYDelegate(ByVal idm As String, ByRef strCardIdm As String) As Boolean Private asyncCall As MYDelegate Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load websrv.Timeout = 5 * 1000 'タイムアウトを5秒に設定する 'ポーリング開始 Dim ap As New ASyncPolling asyncCall = New MYDelegate(AddressOf ap.PollingLoop) Dim ac As New AsyncCallback(AddressOf MyAsyncCallback) Dim ar As IAsyncResult = asyncCall.BeginInvoke(Nothing, Nothing, ac, Nothing) End Sub Private Sub MyAsyncCallback(ByVal ar As IAsyncResult) Dim asyncCall As MYDelegate = CType(CType(ar, Runtime.Remoting.Messaging.AsyncResult).AsyncDelegate, MYDelegate) Dim strCardIdm As String ' EndInvoke で結果を取り出す。 Dim result As Boolean = asyncCall.EndInvoke(strCardIdm, ar) Dim strReceiveData As String Try strReceiveData = websrv.GETNAME(strCardIdm) 'WEBサービス呼出し Catch ex As Exception 'TimeOut Me.ServerCheckTimer.Start() 'タイマーを起動!←問題の箇所 Exit Sub End Try End Sub Private Sub ServerCheckTimer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ServerCheckTimer.Tick 'サーバの生存チェック Dim dt As DateTime Try dt = websrv.GETTIME Catch ex As Exception lblName.Text = "サーバのIIS再起動が有効です" Exit Sub End Try lblName.Text = "" End Sub | ||||
|
投稿日時: 2003-10-06 13:55
コントロール(ってかフォーム)のInvoke使って、タイマの操作をする部分をUIスレッドにしてやるとどうなるでしょうか? # Timerのドキュメント参照。 コードの詳細はあまりよく見てませんので、あしからず。 | ||||
|
投稿日時: 2003-10-06 17:47
なちゃ様
回答ありがとうございます。 今まで単純にシングルスレッドしか使った事がないので、「Invokeを使ってタイマーを操作する」というイメージがつかめないので調べてみます。 またどなたか以下の私の勝手に思ってる見解が正しいのか教えてください。 コールバックメソッドは別のスレッドで実行されるため、親のスレッド(フォーム)のコンポーネントで追加したタイマーは呼び出すことはできない???? よろしくお願いします。 | ||||
1
