private void UpdateThread(object state)
        {
            while (true)
            {
                RabbitMQ.Messages lst = RabbitMQ.Get(QueueName, ChannelName);

                if (RabbitMQ.IsException)
                {
                    break;
                }
                if (lst.Count > 0)
                {
                    Dispatcher.BeginInvoke(DispatcherPriority.Render,
                                           (Action)(() =>
                    {
                        DeserializeJSONtoDataGrid(lst);
                    }));
                }
                else
                {
                    Dispatcher.BeginInvoke(DispatcherPriority.Render,
                                           (Action)(() =>
                    {
                        LblState.Content = "Loaded";
                    }));
                }

                Thread.Sleep(1000);
            }
            Dispatcher.BeginInvoke(DispatcherPriority.Render,
                                   (Action)(() =>
            {
                LblState.Content = "Exited";
            }));
        }
        private void DeserializeJSONtoDataGrid(RabbitMQ.Messages messages)
        {
            DataTable datatable = new DataTable();

            foreach (PropertyInfo prop in ClassType.GetProperties())
            {
                if (prop.Name.Equals("AdditionalProperties"))
                {
                    continue;
                }
                if (prop.Name.Equals("Details"))
                {
                    continue;
                }

                DataColumn column;
                if (prop.PropertyType == typeof(Timestamp))
                {
                    column = new DataColumn
                    {
                        DataType   = typeof(DateTime),
                        ColumnName = prop.Name,
                        ReadOnly   = true
                    };
                }
                else if (prop.PropertyType.IsEnum)
                {
                    column = new DataColumn
                    {
                        DataType   = typeof(string),
                        ColumnName = prop.Name,
                        ReadOnly   = true
                    };
                }
                else
                {
                    column = new DataColumn
                    {
                        DataType   = prop.PropertyType,
                        ColumnName = prop.Name,
                        ReadOnly   = true
                    };
                }

                datatable.Columns.Add(column);
            }

            DataColumn col = new DataColumn
            {
                DataType   = typeof(ulong),
                ColumnName = "DeliveryTag",
                ReadOnly   = true
            };

            datatable.Columns.Add(col);

            col = new DataColumn
            {
                DataType   = typeof(bool),
                ColumnName = "Redelivered",
                ReadOnly   = true
            };
            datatable.Columns.Add(col);

            foreach (RabbitMQ.Message message in messages)
            {
                JObject elem = JsonConvert.DeserializeObject <JObject>(message.Body);

                DataRow dr = datatable.NewRow();
                foreach (PropertyInfo prop in ClassType.GetProperties())
                {
                    if (prop.Name.Equals("AdditionalProperties"))
                    {
                        continue;
                    }
                    if (prop.Name.Equals("Details"))
                    {
                        continue;
                    }

                    if (prop.PropertyType == typeof(Timestamp))
                    {
                        JProperty prop1;
                        if ((prop1 = elem.Property($"{char.ToLower(prop.Name[0])}{prop.Name.Substring(1)}")) != null)
                        {
                            dr[prop.Name] = DateTimeOffset.FromUnixTimeMilliseconds((long)prop1.Value["millis"]).DateTime;
                        }
                    }
                    else
                    {
                        JProperty prop1;
                        if ((prop1 = elem.Property($"{char.ToLower(prop.Name[0])}{prop.Name.Substring(1)}")) != null)
                        {
                            dr[prop.Name] = prop1.Value;
                        }
                    }
                }

                dr["DeliveryTag"] = message.DeliveryTag;
                dr["Redelivered"] = message.Redelivered;
                datatable.Rows.Add(dr);
            }

            if (DgMain.ItemsSource == null)
            {
                DgMain.ItemsSource = datatable.DefaultView;
                if (datatable.Columns.Contains("DeliveryTag"))
                {
                    DgMain.Items.SortDescriptions.Add(new System.ComponentModel.SortDescription("DeliveryTag", System.ComponentModel.ListSortDirection.Descending));
                }
                DgMain.Tag = datatable;
            }
            else
            {
                ((DataTable)DgMain.Tag).Merge(datatable);
            }
        }