public async void Refresh()
        {
            if (_isBusy)
            {
                return;
            }

            lock (LockObject)
            {
                if (_isBusy)
                {
                    return;
                }

                _isBusy = true;
            }

            _refreshTimer.IsEnabled = false;

            Task <DatabaseSessions> task = null;
            var exception = await App.SafeActionAsync(() => task = _databaseMonitor.GetAllSessionDataAsync(CancellationToken.None));

            _isBusy = false;

            if (exception != null)
            {
                Messages.ShowError(exception.Message, owner: this);
                return;
            }

            _refreshTimer.IsEnabled = true;

            var sessions = task.Result;

            if (!AreColumnHeadersEqual(sessions.ColumnHeaders))
            {
                SessionDataGrid.Columns.Clear();
                foreach (var columnHeader in sessions.ColumnHeaders)
                {
                    var column =
                        new DataGridTextColumn
                    {
                        Binding = new Binding($"{nameof(DatabaseSession.Values)}[{columnHeader.ColumnIndex}]")
                        {
                            Converter = columnHeader.CustomConverter ?? CellValueConverter.Instance
                        },
                        EditingElementStyle = (Style)Application.Current.Resources["CellTextBoxStyleReadOnly"]
                    };

                    DataGridHelper.ApplyColumnStyle(column, columnHeader);
                    SessionDataGrid.Columns.Add(column);
                }
            }

            lock (_databaseSessions)
            {
                MergeRecords(_databaseSessions, sessions.Rows, r => r.Id, MergeSessionRecordData);
            }
        }