我的申请有点问题
我想每隔10秒在我的UI上更新一些内容。我首先使用了DispatcherTimer
,但它会在短时间内阻止我的UI,因为更新方法需要从Web加载一些东西,这个操作需要一些时间。
现在我想到了某种背景工作者,我找到了BackgroundTasks
就我理解的而言,后台任务的问题是,即使应用程序被暂停,它们也应该作为更新程序。我不需要那个。
我只想更新我的应用程序是否正在运行,如果它被暂停。
有没有好办法解决这个问题? 有什么建议可以用于此吗?
提前致谢!
答案 0 :(得分:11)
你需要两件事:
定时器
您可以使用10秒间隔更新System.Timers.Timer
中的用户界面。
分派器
您需要使用Dispatcher.Invoke
来更改UI,而无需按住主UI线程。相反,应该在单独的线程(Process
方法)上调用方法Timer
,而不是主UI线程,并使用{{1}在其中提醒主UI线程进行更改。
Dispatcher
答案 1 :(得分:2)
您需要创建一个运行代码部分的线程,该线程从网站获取并处理信息。这样,您的表单将毫不犹豫,因为它将与处理部分位于不同的线程上。
This有关代码项目的文章可以帮助您入门。
答案 2 :(得分:0)
此外,你可以启动一个定时器,它有一个经过的事件,每当定时器超过一定的时间周期时就会发生。
答案 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#,因此这可能不是最好的方法。