如何从后台线程运行计时器并在UI线程中显示结果?

时间:2013-05-16 13:49:53

标签: c# windows-phone-8 backgroundworker

我正在开发Windows Phone 8中的游戏应用程序,向玩家显示已用时间(hh:min:ss)格式,因此在我的用户界面中

<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);
}

现在我的代码工作正常,但它唯一的问题是它在UI线程中运行,在Windows Phone 8中测试它要求我检查并放入后台线程。我尝试使用后台工作线程但这不会更新UI,它是空白的。有什么帮助吗?

任何机构都可以告诉我如何在后台线程中运行并仍以小时:min:sec格式显示时间。 感谢

2 个答案:

答案 0 :(得分:2)

尝试

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

要进行格式化,请尝试

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

答案 1 :(得分:0)

哦合法

myDispatcherTimer.Interval = new TimeSpan();

您将间隔设置为0的时间间隔。这不是非常有效。可能会破坏你的用户界面。

UI中时间显示的分辨率是多少?秒?这样做:

myDispatcherTimer.Interval = TimeSpan.FromSeconds(1);

这可能足以满足检查要求。当毫秒级每秒只更改一次时,毫无意义地在毫秒级更新UI。