仙女不吃蛋黄 2023-04-10 18:39 采纳率: 63.6%
浏览 79
已结题

wpf中用timerUI界面会出现卡顿问题

img


我不用这个定时器的时候所有的功能都正常,但是只要开了这个定时器UI界面就会卡死,按理来说timer不是另起线程嘛,还是我这个写的有问题

  • 写回答

4条回答 默认 最新

  • Zyb0627 2023-04-10 20:00
    关注

    引用chatGPT作答,由于定时器是在另一个线程上执行的,而 Dispatcher.BeginInvoke 将操作分发到主线程上执行,因此在定时器的回调函数中使用 Dispatcher.BeginInvoke 可能会导致主线程的阻塞。这可能会导致卡顿或 UI 界面失去响应。

    此外,使用定时器时,应该避免进行过多的操作,以免对应用程序的性能产生负面影响。如果需要执行较长时间的操作,可以考虑使用后台线程或异步方法。

    建议你使用 DispatcherTimer,它是专门为 WPF 应用程序设计的,它可以在 UI 线程上运行,从而避免可能出现的阻塞问题。同时,DispatcherTimer 也比 System.Timers.Timer 更容易使用。

    下面是一个使用 DispatcherTimer 的示例代码:

    private DispatcherTimer waitTimer;
    
    public void Wait(int index)
    {
        path.Style = canvas.Resources["red"] as Style;
        GlobalSub temp = FindSub(this.subwayID);
        temp.strState = "临时停车";
        this.listIndex = index;
        waitTimer = new DispatcherTimer();
        waitTimer.Interval = TimeSpan.FromSeconds(1 / GlobalData.doubleSpeed);
        waitTimer.Tick += WaitTime;
        waitTimer.Start();
    }
    
    private void WaitTime(object sender, EventArgs e)
    {
        double X1, X2, Y1, Y2;
        X1 = this.ellipse1.Center.X;
        Y1 = this.ellipse1.Center.Y;
        X2 = TrackModel.listSubway[listIndex - 1].ellipse1.Center.X;
        Y2 = TrackModel.listSubway[listIndex - 1].ellipse1.Center.Y;
        Console.WriteLine(TrackModel.listSubway[listIndex - 1].subwayID);
        if (Scheduling.IsResum(X1, Y1, X2, Y2) == 1)
        {
            Console.WriteLine("c# IF");
            Resum();
            path.Style = canvas.Resources["green"] as Style;
            waitTimer.Stop();
        }
    }
    

    这个例子使用 DispatcherTimer 替换了 System.Timers.Timer,并且不再需要使用 Dispatcher.BeginInvoke。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月19日
  • 已采纳回答 4月11日
  • 创建了问题 4月10日

悬赏问题

  • ¥15 Stata链式中介效应代码修改
  • ¥15 latex投稿显示click download
  • ¥15 请问读取环境变量文件失败是什么原因?
  • ¥15 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错