private void OnSessionDataExpired(object sender, DataLogCleanupEventArgs e)
        {
            if (e.SessionIds.Any())
            {
                AssetReservationManager           assetManager   = new AssetReservationManager(DbConnect.AssetInventoryConnectionString, null);
                FrameworkClientReservationManager clientManager  = new FrameworkClientReservationManager(DbConnect.AssetInventoryConnectionString);
                DomainAccountReservationManager   accountManager = new DomainAccountReservationManager(DbConnect.AssetInventoryConnectionString);

                assetManager.ReleaseSessionReservations(e.SessionIds);
                clientManager.ReleaseSessionReservations(e.SessionIds);
                accountManager.ReleaseSessionReservations(e.SessionIds);
            }
        }
        private void CleanupAssetHosts(string sessionId)
        {
            try
            {
                SetTraceSessionContext(sessionId);
                using (AssetInventoryContext context = DbConnect.AssetInventoryContext())
                {
                    var reservedAssets = context.AssetReservations.Where(n => n.SessionId == sessionId).Select(n => n.AssetId).ToList();

                    // Parallel process each Jedi simulator reserved for this session - shut down the host machine.
                    List <DeviceSimulator> jediSimulators = context.Assets.OfType <DeviceSimulator>().Where(n => reservedAssets.Contains(n.AssetId) && n.SimulatorType == "Jedi").ToList();
                    Parallel.ForEach(jediSimulators, a => CleanupAssetHostsHandler(a));
                }

                AssetReservationManager reservationManager = new AssetReservationManager(DbConnect.AssetInventoryConnectionString, "STF Console");
                reservationManager.ReleaseSessionReservations(sessionId);
            }
            catch (Exception ex)
            {
                EventPublisher.PublishDispatcherException(ex);
            }
        }