WPF Task.Run ==> Поток не может получить доступ к этому объекту - PullRequest
1 голос
/ 17 мая 2019

У меня есть 3 пользовательских элемента управления в моей основной форме, и я создал все пользовательские элементы управления в основной форме Ctor. Проблема в том, что я использую Task.Run в Ctor Monitoring, и все работает нормально, но когда я изменяю usercontrol (Page) и возвращаюсь в МониторингСтраница, task.run в Ctor Monitoring не работает, но когда я использую Dispatcher.Invoke, все коды работают нормально, но пользовательский интерфейс зависает.

Основная форма: // Pages PageHome ph;PageMonitoring PM;PageAboutus pa;

    public FrmMain(string userName, string password)
    {
        InitializeComponent();

        HomeLoadOfflineHelper.HomeLoadOffline(userName, password);

        txbUserName = userName;

        ph = new PageHome(userName, password);
        pm = new PageMonitoring();
        pa = new PageAboutus();

        DataContext = this;
    }

Ctor мониторинга:

    public PageMonitoring()
    {
        InitializeComponent();
        InitializeNetworkInterface();

        Task.Run(() =>
        {

            short Counter = 0;

            LessPingSeries = new ChartValues<ObservableValue> { };
            NormalPingSeries = new ChartValues<ObservableValue> { };
            DownloadSeries = new ChartValues<ObservableValue> { };
            UploadSeries = new ChartValues<ObservableValue> { };

            while (true)
            {
                Thread.Sleep(2000);

                MessageBox.Show("OK");

                using (Ping ping = new Ping())
                {
                    LessPingSeries.Add(new ObservableValue(ping.Send("8.8.8.8").RoundtripTime));
                    NormalPingSeries.Add(new ObservableValue(ping.Send("4.2.2.4").RoundtripTime));
                }

                DownloadSeries.Add(new ObservableValue(ByteSize.FromBytes(bytesReceivedSpeed).MegaBytes));
                UploadSeries.Add(new ObservableValue(ByteSize.FromBytes(bytesSentSpeed).MegaBytes));

                Counter++;
                if (Counter >= 5)
                {
                    LessPingSeries.RemoveAt(0);
                    NormalPingSeries.RemoveAt(0);

                    DownloadSeries.RemoveAt(0);
                    UploadSeries.RemoveAt(0);

                    Counter--;
                }

                Application.Current.Dispatcher.Invoke(() =>
                {
                    UpdateNetworkInterface();
                });
            }
        });

        DataContext = this;
    }
...