2012-11-24 35 views
6

我的应用程序出现了一些问题。
我想每10秒更新一次我的UI。我首先使用了DispatcherTimer,但它会在短时间内阻止我的用户界面,因为更新方法需要从网络加载某些内容,并且此操作需要一些时间。 现在我想到了某种背景工作者,我发现了BackgroundTasks。
问题与后台任务是,据我理解正确的话,那他们应该作为,即使应用程序暂停更新程序。我不需要那个。 我只想更新,如果我的应用程序正在运行,而不是暂停。后台计时器更新用户界面?

有没有办法解决这个问题的好办法? 有什么建议使用这个?

在此先感谢!

+0

我不认为这有什么不妥,使用后台工作这一点。它不应该导致你任何问题,但如果你不想使用它,你可以使用线程,这基本上是后台工作者做的一些添加。查看我的答案,了解如何做到这一点。 – FrostyFire

+0

初学者,你有什么尝试?你可以启动一个线程并跳舞。请参阅:1. http://msdn.microsoft.com/en-us/library/aa645740%28v=vs.71%29.aspx 2. http://msdn.microsoft.com/en-us/library/ms173178 %28V = VS.80%29.aspx 3. https://www.google.ca/#hl=en&sugexp=les%3B&gs_nf=3&tok=BSvnKvGpLPeMsccfqVbvVQ&cp=9&gs_id=bz&xhr=t&q=thread+c%23&pf=p&tbo=d&sclient = PSY-AB和OQ =螺纹+ C%23&gs_l =&PBX = 1&BAV = on.2,or.r_gc.r_pw.r_cp.r_qf。&FP = d74e08ea70650bbd&BPCL = 38897761&BIW = 1280&波黑= 892 4. http://msdn.microsoft.com/ en-us/library/system.threading.thread.aspx 5. http://msdn.microsoft.com/en-us/library/ms173178。 –

回答

11

你需要为它两件事情:

  1. 定时器

    您可以System.Timers.Timer与间隔10秒更新UI。

  2. 调度

    您需要使用Dispatcher.Invoke更改UI未持有主UI线程。应该在单独线程Timer方法)上调用方法Process,而不是主UI线程,并使用Dispatcher来提醒主UI线程进行更改。

    Process() // method to be called after regular interval in Timer 
    { 
        // lengthy process, i.e. data fetching and processing etc. 
    
        // here comes the UI update part 
        Dispatcher.Invoke((Action)delegate() { /* update UI */ }); 
    } 
    
+0

System.Timers.Timer不能用来更新用户界面,你尝试过吗?这是他们在MSDN中编写的内容,但我还没有尝试过:如果使用带有用户界面元素(如窗体或控件)的System.Timers.Timer类,而不将定时器放置在该用户界面元素上,窗体或控件包含定时器到SynchronizingObject属性,以便将事件封送到用户界面线程。 https://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.110).aspx –

+0

我试过了,它的工作你必须添加下面的代码行来分配表单作为同步对象t.SynchronizingObject =(this); –

0

此外,您可以启动一个定时器,其中有一个经过的事件,每出现一个计时器经过一定的时间周期。

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

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

This的代码项目文章应该让你开始。