Проблема с обновлением текстового блока в WP7 с таймером - PullRequest
1 голос
/ 02 августа 2011

Я работаю над приложением, которое (в качестве незначительного подмножества его функций) обеспечит таймер обратного отсчета.Однако могут быть и будут случаи, когда одновременно происходит многократный обратный отсчет.Каждый обратный отсчет имеет свой собственный элемент в сводном представлении.Так как эти обратные отсчеты создаются динамически, я добавляю текстовый блок (который служит выходом для оставшегося времени) для каждого обратного отсчета в список, и я установил таймер для вызова метода, который циклически перебирает каждый из этих текстовых блоковв списке и обновите их соответственно.Тем не менее, я получаю исключение «System.UnauthorizedAccessException», но я не совсем уверен, почему.Мне говорят, что это ошибка «Неверный межпотоковый доступ».

Вот строка, которая является ошибочной:

c.Label.Dispatcher.BeginInvoke(delegate() { c.Label.Text = timeRemaining; });

Вот полный метод:

private static void TimeRemainingCallback(object state)
    {
        if (countDowns.Count == 0)
        {
            return;
        }

        foreach (CountDown c in countDowns)
        {
            DateTime rightNow = DateTime.Today;

            if (c.ExpirationDate >= rightNow)
            {
                DateTime offsetExpiration = c.ExpirationDate.Add(c.LocalNow);
                TimeSpan timeDifference = offsetExpiration.Subtract(rightNow);


                String timeRemaining = "";
                String timeDays = "";
                String timeHours = "";
                String timeMinutes = "";
                String timeSeconds = "";

                if (timeDifference.Days == 1)
                {
                    timeDays = "1 Day";
                }
                else
                {
                    timeDays = timeDifference.Days + " Days";
                }

                if (timeDifference.Hours == 1)
                {
                    timeHours = "1 Hour";
                }
                else
                {
                    timeHours = timeDifference.Hours + " Hours";
                }

                if (timeDifference.Minutes == 1)
                {
                    timeMinutes = "1 Minute";
                }
                else
                {
                    timeMinutes = timeDifference.Minutes + " Minutes";
                }

                if (timeDifference.Seconds == 1)
                {
                    timeSeconds = "1 Second";
                }
                else
                {
                    timeSeconds = timeDifference.Seconds + " Seconds";
                }

                if (timeDifference.Days == 0 && timeDifference.Hours >= 1)
                {
                    timeRemaining = timeHours + " " + timeMinutes;
                }
                else if (timeDifference.Days == 0 && timeDifference.Hours == 0 && timeDifference.Minutes >= 1)
                {
                    timeRemaining = timeMinutes + " " + timeSeconds;
                }
                else if (timeDifference.Days == 0 && timeDifference.Hours == 0 && timeDifference.Minutes == 0)
                {
                    timeRemaining = timeSeconds;
                }
                else
                {
                    timeRemaining = timeDays + " " + timeHours + " " + timeMinutes;
                }

                c.Label.Dispatcher.BeginInvoke(delegate() { c.Label.Text = timeRemaining; });
            }
        }
    }

Вот как я создаю таймер, единственный раз, когда упоминается CallBack:

Timer updateRemainingTime = new Timer(TimeRemainingCallback, null, 0, 1000);

Список действительно полон объектов, которые содержат дату и текстовое поле (которое здесь называется меткой) таким образом, сделка c.Label.

timeRemaining - это строка оставшегося времени, которая формируется в обратном вызове по таймеру.

Есть идеи о том, что здесь происходит?Есть лучшие идеи о том, как это сделать?

1 Ответ

1 голос
/ 03 августа 2011

Вызовите Dispatcher для всей итерации цикла и удалите текущий вызов Dispatcher.

Dispatcher.BeginInvoke(() =>
{
    foreach (CountDown c in countDowns)
    {
       // Actions here.
       c.Label.Text = timeRemaining;
    }
});

Я предполагаю, что countDowns привязано к элементу управления пользовательского интерфейса списка, с которым вы работаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...