Imports System.Timers Imports DigitalData.GUIs.ClientSuite Imports DigitalData.GUIs.ClientSuite.Base Imports DigitalData.Modules.EDMIAPI.IDBServiceReference Imports DigitalData.Modules.Logging Namespace Workers Public Class HeartbeatWorker Inherits BaseClass Implements IWorker Private _Channel As IIDBServiceChannel Public Event OnlineChanged As OnlineChangedEventHandler Public Delegate Sub OnlineChangedEventHandler(sender As Object, Online As Boolean) Public ReadOnly Property Interval As Integer = 4000 Implements IWorker.Interval Public Sub New(LogConfig As LogConfig) MyBase.New(LogConfig) End Sub Public Sub Setup() Implements IWorker.Setup _Channel = My.ChannelFactory.CreateChannel() _Channel.Open() End Sub Public Async Sub Callback(manager As WorkerManager, e As ElapsedEventArgs) Implements IWorker.Callback Try Logger.Debug("Checking if Service is up...") If _Channel.State = ServiceModel.CommunicationState.Faulted Then _Channel = My.ChannelFactory.CreateChannel() End If ' Connect to service and send hearbeat request Dim oResult = Await _Channel.HeartbeatAsync() Logger.Debug("Service is online") SetOnlineState(True) Catch ex As Exception Logger.Debug("Service is offline!") Logger.Error(ex) SetOnlineState(False) Finally My.Application.Service.LastChecked = DateTime.Now End Try End Sub Public Sub Teardown() Implements IWorker.Teardown ' TODO: Close channel gracefully End Sub Private Sub SetOnlineState(NewState As Boolean) If My.Application.Service.Online <> NewState Then My.Application.Service.Online = NewState RaiseEvent OnlineChanged(Me, NewState) End If End Sub End Class End Namespace