- PR -

非同期メソッドのコールバックからタイマーの起動

1
投稿者投稿内容
ポテチ
ベテラン
会議室デビュー日: 2003/03/28
投稿数: 69
投稿日時: 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/06/11
投稿数: 872
投稿日時: 2003-10-06 13:55
引用:

でもコールバックメソッド内でMe.Timer1.Enable = True としてもタイマーが有効になりません。
コールバックメソッドからタイマーを呼び出すには何か特殊な事をする必要がありますか?


'TimeOut
Me.ServerCheckTimer.Start() 'タイマーを起動!←問題の箇所



コントロール(ってかフォーム)のInvoke使って、タイマの操作をする部分をUIスレッドにしてやるとどうなるでしょうか?
# Timerのドキュメント参照。

コードの詳細はあまりよく見てませんので、あしからず。
ポテチ
ベテラン
会議室デビュー日: 2003/03/28
投稿数: 69
投稿日時: 2003-10-06 17:47
なちゃ様
回答ありがとうございます。

今まで単純にシングルスレッドしか使った事がないので、「Invokeを使ってタイマーを操作する」というイメージがつかめないので調べてみます。

またどなたか以下の私の勝手に思ってる見解が正しいのか教えてください。
コールバックメソッドは別のスレッドで実行されるため、親のスレッド(フォーム)のコンポーネントで追加したタイマーは呼び出すことはできない????
よろしくお願いします。
1

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