Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 后台定时器更新用户界面?_C#_Windows Runtime - Fatal编程技术网

C# 后台定时器更新用户界面?

C# 后台定时器更新用户界面?,c#,windows-runtime,C#,Windows Runtime,我的申请有点问题。 我想每10秒更新一下我的UI。我首先使用了一个dispatchermer,但它会在短时间内阻塞我的UI,因为更新方法需要从web加载一些内容,并且此操作需要一些时间。 现在我想到了一些背景工作者,我找到了一些背景任务。 据我正确理解,后台任务的问题是,即使应用程序挂起,它们也应该充当更新程序。我不需要那个。 我只想在我的应用程序正在运行时更新,而不是挂起时更新 有没有解决这个问题的好办法? 你有什么建议吗 提前谢谢 此外,您还可以启动一个计时器,它有一个经过的事件,每次计时器

我的申请有点问题。
我想每10秒更新一下我的UI。我首先使用了一个
dispatchermer
,但它会在短时间内阻塞我的UI,因为更新方法需要从web加载一些内容,并且此操作需要一些时间。 现在我想到了一些背景工作者,我找到了一些背景任务。
据我正确理解,后台任务的问题是,即使应用程序挂起,它们也应该充当更新程序。我不需要那个。 我只想在我的应用程序正在运行时更新,而不是挂起时更新

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


提前谢谢

此外,您还可以启动一个计时器,它有一个经过的事件,每次计时器经过某个时间周期时都会发生该事件


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


    关于代码项目的文章应该让您开始学习。

    您需要两件事:

  • 计时器

    您可以在中以10秒的间隔更新UI

  • 调度员

    您需要使用
    Dispatcher.Invoke
    来更改UI,而不保留主UI线程。相反,应该在主UI线程以外的单独线程(
    Timer
    method)上调用方法
    Process
    ,并在其中使用
    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 */ });
    }
    

  • 其他答案缺少正确的清理:当计时器在窗口关闭的确切时刻触发时,我会在尝试运行
    Dispatcher.Invoke
    时收到未捕获的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#,所以这可能不是最好或正确的做事方式。

    首先,您尝试了什么?你可以点燃一根线,用它跳舞。见:1。2.3.4.5.我认为使用后台工作人员进行此操作没有任何问题。它应该不会给您带来任何问题,但如果您不想使用线程,您可以使用线程,这基本上是后台工作人员通过一些附加功能所做的。查看我的答案,了解如何执行此操作。System.Timers.Timer无法用于更新UI。您尝试过吗?这是他们在MSDN中编写的内容,但我还没有尝试过:如果将System.Timers.Timer类与用户界面元素(如窗体或控件)一起使用,而不将计时器放置在该用户界面元素上,请将包含计时器的窗体或控件分配给SynchronizingObject属性,以便将事件封送到用户界面线程。我试过了,它成功了。您必须添加以下代码行,才能将表单指定为sync object t.synchroningobject=(this);