2013-05-16 2 views
0

Я занимаюсь разработкой игровых приложений в Windows Phone 8, который показывает истекшее время (чч: мин: сс) для игрока, так что в моем UIКак запустить таймер из фонового потока и отобразить результат в потоке пользовательского интерфейса?

<StackPanel x:Name="statusPanel2" > 
    <TextBlock x:Name="tbTimer" Text=" Time: " /> 
    <TextBlock x:Name="timerValue" Text="{Binding ''}" /> 

в код я начинаю таймер, когда игра начинается

private void gamestart() 
{ 
myDispatcherTimer.Interval = new TimeSpan(); 
      myDispatcherTimer.Tick += new EventHandler(Each_Tick); 
      myDispatcherTimer.Start(); 
      _sw.Start(); } 


private void Each_Tick(object sender, EventArgs e) 
{ 
timerValue.Text = _sw.Elapsed.ToString().Substring(0, _sw.Elapsed.ToString().LastIndexOf(":") + 3); 
} 

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

может любое тело сказать мне, как работать в фоновом потоке и по-прежнему отображать время в часе: мин. Сек. Формат. Благодаря

ответ

2

Try

Dispatcher.BeginInvoke(new Action(() => 
{ 
    timerValue.Text = _sw.Elapsed.ToString().Substring(0, _sw.Elapsed.ToString().LastIndexOf(":") + 3); 
})); 

Для форматирования, попробуйте

.ToString(@"hh\:mm\:ss"); 
+0

Спасибо за ваш ответ, но этот 'Dispatcher.BeginInvoke (новый Action (() => {}' кусок кода будет запущен в потоке пользовательского интерфейса, справа? И метод 'Every_Tick (object sender, EventArgs e)' а также в потоке пользовательского интерфейса. Так что же он делает? Ответьте мне – Debhere

+0

Возможно, я неправильно понял первоначальное требование. Я думал, что вы хотите взаимодействовать с компонентами в своем основном потоке из другого потока. Вы не можете сделать это напрямую, потому что 2 потока независимы друг от друга, поэтому вам нужен диспетчер, чтобы управлять им. – DaveDev

0

О lawd

myDispatcherTimer.Interval = new TimeSpan(); 

Вы установки интервала в отрезок времени 0. Это не очень эффективно , Наверное, выбивает ад из вашего интерфейса.

Какое разрешение отображения времени в пользовательском интерфейсе? Секунды? Сделайте это:

myDispatcherTimer.Interval = TimeSpan.FromSeconds(1); 

Этого может быть достаточно, чтобы удовлетворить проверку. Нет смысла обновлять пользовательский интерфейс на миллисекундах, когда он меняется только один раз в секунду.

+0

Спасибо, я сделаю это, на самом деле очень плохой стиль кодирования, я улучшаю :) – Debhere

Смежные вопросы