この質問に基づいて、Jim Mischel の推奨に基づいてソリューションに waithandles/eventwaithandle を使用することにしました。私は「ほぼ」それを機能させています。ここにコードがあります
Private Sub InitDeploymentCheck()
moDeploymentCheck = New TRS.Deployment.TRSDeploymentCheck(EnvironmentVariables.Environment, AppDomain.CurrentDomain.BaseDirectory.Contains("bin"), MDIMain)
AddHandler moDeploymentCheck.DeploymentNeeded,
Sub()
moTimer = New System.Windows.Forms.Timer()
moTimer.Interval = 300000 '5 minutes
moTimer.Enabled = True
AddHandler moTimer.Tick,
Sub()
'check to see if the message box exist or not before throwing up a new one
'check to see if the wait handle is non signaled, which means you shouldn't display the message box
If waitHandle.WaitOne(0) Then
'set handle to nonsignaled
waitHandle.Reset()
MessageBox.Show(MDIMain, "There is a recent critical deployment, please re-deploy STAR to get latest changes.", "Critical Deployment", MessageBoxButtons.OK, MessageBoxIcon.Warning)
'set the handle to signaled
waitHandle.Set()
End If
End Sub
waitHandle.Set()
MessageBox.Show(MDIMain, "There is a recent critical deployment, please re-deploy STAR to get latest changes.", "Critical Deployment", MessageBoxButtons.OK, MessageBoxIcon.Warning)
End Sub
End Sub
繰り返しますが、これはほとんどすべてのアプリケーションが継承する基本フォームからのものです。単一のアプリを使用している場合、完全に機能します。ベース フォームから継承する複数のアプリを実行していて、誰かがメッセージ ボックスの 1 つだけをクリックすると、別のアプリに 2 つ目のメッセージ ボックスが表示されることがあります。私はもともと waithandle を static/shared として宣言していて、それが問題だと思っていましたが、そうではありませんでした。また、各アプリに独自の待機ハンドルを作成させ、それをベースに渡そうとしましたが、同じ結果になりました。待機ハンドルが異なるアプリケーション間で共有されているように見える理由を知っている人はいますか? ところで、waitHandle は実際には ManualResetEvent です