Я работаю над приложением, которое (в качестве незначительного подмножества его функций) обеспечит таймер обратного отсчета.Однако могут быть и будут случаи, когда одновременно происходит многократный обратный отсчет.Каждый обратный отсчет имеет свой собственный элемент в сводном представлении.Так как эти обратные отсчеты создаются динамически, я добавляю текстовый блок (который служит выходом для оставшегося времени) для каждого обратного отсчета в список, и я установил таймер для вызова метода, который циклически перебирает каждый из этих текстовых блоковв списке и обновите их соответственно.Тем не менее, я получаю исключение «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 - это строка оставшегося времени, которая формируется в обратном вызове по таймеру.
Есть идеи о том, что здесь происходит?Есть лучшие идеи о том, как это сделать?