Как постоянно обновлять sh содержимое сетки из кода за файлом - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь постоянно обновлять sh содержимое моей сетки параллельным потоком. Это код, который не работает:

private void ContiniouslyRefreshPage(int interval)
        {
            var startTimeSpan = TimeSpan.Zero;
            var periodTimeSpan = TimeSpan.FromSeconds(interval);           
            Dictionary<string, string> lastCheck = bluetoothService.CheckRequirements();
            var timer = new System.Threading.Timer((e) =>
            {
                Dictionary<string, string> newCheck = bluetoothService.CheckRequirements();
                if (!(lastCheck.Count == newCheck.Count && !bluetoothService.CheckRequirements().Except(lastCheck).Any()))
                {
                    Application.Current.MainPage = new MasterDetail
                    {
                        Detail = new NavigationPage(new TestingPage())
                        {
                            BarBackgroundColor = Color.White,
                            BarTextColor = Color.Black
                        }
                    };
                    lastCheck = newCheck;
                }
            }, null, startTimeSpan, periodTimeSpan);
        }

Предложение if работает, поэтому страница должна ссылаться на sh только при изменении моего набора данных (набор данных возвращается методом CheckRequirements)

Код не работает: он попадает в if-clause при изменении, но не инициализируется и не отображает новую страницу.

Я думаю, что это совсем не лучшая практика, я хотел бы получить совет, как это сделать лучше.

1 Ответ

1 голос
/ 28 мая 2020

Операция обновления пользовательского интерфейса должна выполняться в основном потоке. Попробуйте поместить соответствующий код функции в основной поток. Например:

private void ContiniouslyRefreshPage(int interval)
{
    ...
    MainThread.BeginInvokeOnMainThread(() =>
    {
        Application.Current.MainPage = new MasterDetail
        {
            Detail = new NavigationPage(new TestingPage())
            {
                BarBackgroundColor = Color.White,
                BarTextColor = Color.Black
            }
        };
    };
}
...