用于更新UI的后台计时器?

时间:2012-11-24 00:11:40

标签: c# windows-runtime

我的申请有点问题 我想每隔10秒在我的UI上更新一些内容。我首先使用了DispatcherTimer,但它会在短时间内阻止我的UI,因为更新方法需要从Web加载一些东西,这个操作需要一些时间。 现在我想到了某种背景工作者,我找到了BackgroundTasks 就我理解的而言,后台任务的问题是,即使应用程序被暂停,它们也应该作为更新程序。我不需要那个。 我只想更新我的应用程序是否正在运行,如果它被暂停。

有没有好办法解决这个问题? 有什么建议可以用于此吗?

提前致谢!

4 个答案:

答案 0 :(得分:11)

你需要两件事:

  1. 定时器

    您可以使用10秒间隔更新System.Timers.Timer中的用户界面。

  2. 分派器

    您需要使用Dispatcher.Invoke来更改UI,而无需按住主UI线程。相反,应该在单独的线程Process方法)上调用方法Timer,而不是主UI线程,并使用{{1}在其中提醒主UI线程进行更改。

    Dispatcher

答案 1 :(得分:2)

您需要创建一个运行代码部分的线程,该线程从网站获取并处理信息。这样,您的表单将毫不犹豫,因为它将与处理部分位于不同的线程上。

This有关代码项目的文章可以帮助您入门。

答案 2 :(得分:0)

此外,你可以启动一个定时器,它有一个经过的事件,每当定时器超过一定的时间周期时就会发生。

  1. http://www.dotnetperls.com/timer

答案 3 :(得分:0)

其他答案缺少适当的清除:当计时器在关闭窗口的确切时间触发时,尝试运行Dispatcher.Invoke时会出现Uncaught TaskCanceledException。在其他问题中,我没有找到解决此问题的帮助。我可以通过关闭窗口时注销计时器回调来解决此问题。

public partial class MainWindow : Window
{
    Timer clockTimer = null;
    public MainWindow()
    {
        clockTimer = new Timer(1.0); // 1 ms update to test for TaskCanceledException 
        clockTimer.Elapsed += Timer_Elapsed;
        clockTimer.AutoReset = true;
        clockTimer.Start();
        Closed += (object sender, EventArgs e) => { clockTimer.Elapsed -= Timer_Elapsed; };
    }
    private void Timer_Elapsed(object sender, ElapsedEventArgs e) {
        var now = DateTime.Now;
        Dispatcher.Invoke((Action)delegate () {
            UpdateTime(now);
        });
    }
}

如果重新显示窗口,显然这不是一个好主意。我尝试添加一个dtor,但由于循环依赖关系,它永远都不会被调用。

免责声明:我不了解C#,因此这可能不是最好的方法。