public void BeginMonitoringConnectionsAsync()
        {
            backgroundWorker         = new BackgroundWorker();
            backgroundWorker.DoWork += (s, e) =>
            {
                while (true)
                {
                    var newConnections = IpHlpApi.GetTcpTableEx();

                    // for each old entry that doesnt exist in new list, remove
                    for (int i = 0; i < TcpInfo.Count; i++)
                    {
                        var existingFound = newConnections.Any(x => TcpInfo[i].Equals(x));
                        if (!existingFound)
                        {
                            new Action(() => TcpInfo.RemoveAt(i)).ExecuteInSpecificThread(dispatcher);
                            i--;
                        }
                    }

                    // for each new entry that doesnt exist, add
                    for (int i = 0; i < newConnections.Length; i++)
                    {
                        bool existingFound = TcpInfo.Any(x => x.Equals(newConnections[i]));
                        if (!existingFound)
                        {
                            var entry = new TcpConnection(newConnections[i].LocalPort,
                                                          newConnections[i].LocalAddress.ToString(),
                                                          newConnections[i].RemotePort,
                                                          newConnections[i].RemoteAddress.ToString(),
                                                          newConnections[i].dwOwningPid,
                                                          newConnections[i].dwState,
                                                          AsyncPropertyPendingText,
                                                          AsyncPropertyLoadingText);
                            new Action(() => TcpInfo.Add(entry)).ExecuteInSpecificThread(dispatcher);
                        }
                    }
                    Thread.Sleep((int)RefreshInterval.TotalMilliseconds);
                }
            };
            backgroundWorker.RunWorkerAsync();
        }