首页 > 其他分享 >WPF频繁更新UI卡顿问题

WPF频繁更新UI卡顿问题

时间:2024-06-23 10:09:41浏览次数:27  
标签:Task Factory PLC UI WPF 连接 卡顿 IsConn

我的WPF程序,需要连接PLC、CCD、RFID、扫码枪、控制卡
所以我写了

  InitHardware();
 private void InitHardware()
 {
     var tasks = new Task[]
     {
         //后台线程长连接,不取消令牌
         Task.Factory.StartNew(() => InitConnPLC(),CancellationToken.None,TaskCreationOptions.LongRunning,TaskScheduler.Default),
         Task.Factory.StartNew(() => InitConnRFId(),CancellationToken.None,TaskCreationOptions.LongRunning,TaskScheduler.Default),
         Task.Factory.StartNew(() => InitConnCCd(),CancellationToken.None,TaskCreationOptions.LongRunning,TaskScheduler.Default),
         Task.Factory.StartNew(() => InitScanCode(),CancellationToken.None,TaskCreationOptions.LongRunning,TaskScheduler.Default),
         Task.Factory.StartNew(() => InitControlCard(),CancellationToken.None,TaskCreationOptions.LongRunning,TaskScheduler.Default),
     };
     Task.Factory.ContinueWhenAll(tasks, completedTasks =>
     {
         // 当所有任务完成时的逻辑
         foreach (var task in completedTasks)
         {
             if (task.IsFaulted)
             {
                 // 处理任务异常
                 Dispatcher.CurrentDispatcher.Invoke(new Action(() =>
                 {
                     HandyOrgMessageBox.Info("Task。PLC连接失败");                      //这段代码先放着,我在其他地方做了异常处理
                 }));
             }
             // 其他所有任务完成时的逻辑
         }
     });
 }
 
  /// <summary>
 /// 初始化PLC,为了应对不同公司的风格
 /// PLC读取Ini文件
 /// </summary>
 public void InitConnPLC()
 {
     PlcClient.Current.PlcCount = SysPlc.PlcCount = IniHelper.Current.GetPath("Config/setting.ini").GetSection("PlcCount").ToInt();
     PlcClient.Current.DefaultPlc = ObPLC.Where(it => it.IP == IPHelper.LocalIP4FromPLC).First(); //如果一个PLC走这条线,用于前期测试,正式发布可以不写DefaultPlc,会自动跟据PlcCount的多少连接
     PlcClient.Current.FindRuningPlc = ObPLC.ToArray(); //如果多个PLC走这条线

     while (true)
     {
         Task.Delay(200);
         Dispatcher.CurrentDispatcher.Invoke(
               new Action(() =>
               {
                   PlcInfo.IsConn = result.IsSuccess;
                   PlcInfo.PlcName = PlcInfo.IsConn ? "已连接PLC" : "未连接PLC";
               })
           );
     }
   
 }

可以看出我在这5个类似的方法中频繁更新UI,因为我要和设备长连接
解决方案1、将更新UI从while中剔除出来,写在UI线程
首先增加一个静态的全局变量

public class SysPlc
{
	public static bool IsConn {get;set;}
}

那么 Dispatcher.CurrentDispatcher.Invoke不必频繁去写。
修改while

  while (true)
  {
      Task.Delay(200);
      var result = PlcClient.Current.ConnectionPLC;
      SysPlc.IsConn  = result.IsSuccess;
  }

然后加入定时器

  _dispatcherTimer = new DispatcherTimer();
  _dispatcherTimer.Interval = TimeSpan.FromMilliseconds(500);
  _dispatcherTimer.Tick += OnTick;
  _dispatcherTimer.Start();

在UI线程通过全局静态传递过来的数据更新UI

  private void OnTick(object sender, EventArgs e)
  {
      PlcInfo.PlcName = SysPlc.IsConn ? "已连接PLC" : "未连接PLC";
  }

标签:Task,Factory,PLC,UI,WPF,连接,卡顿,IsConn
From: https://www.cnblogs.com/guchen33/p/18263124

相关文章

  • Python中的交互式GUI开发:与MATLAB uicontrol的比较
    Python中的交互式GUI开发Python中的交互式GUI开发:与MATLABuicontrol的比较**PythonGUI开发库****Tkinter****PyQt/PySide****与MATLAB的比较****总结**Python中的交互式GUI开发:与MATLABuicontrol的比较在MATLAB中,uicontrol是一个强大的功能,用于创建用户界面控......
  • python pyautogui实现图片识别点击失败后重试
    安装库 pipinstallPillowpipinstallopencv-pythonconfidence作用confidence参数是用于指定图像匹配的信度(或置信度)的,它表示图像匹配的准确程度。这个参数的值在0到1之间,数值越高表示匹配的要求越严格。具体来说,confidence参数用于调整在屏幕上搜索目标图像时......
  • 【区分vue2和vue3下的element UI Descriptions 描述列表组件,分别详细介绍属性,事件,方法
    在ElementUI(为Vue2设计)和ElementPlus(为Vue3设计)中,Descriptions(描述列表)组件通常用于展示一系列的结构化信息。然而,需要明确的是,ElementUI官方库中并没有直接名为Descriptions的组件,但在ElementPlus中,该组件是存在的。以下将分别介绍ElementPlus中的De......
  • 【区分vue2和vue3下的element UI Result 结果组件,分别详细介绍属性,事件,方法如何使用,并
    在Vue2中,ElementUI并没有直接提供名为Result的组件。但是,在Vue3的ElementPlus中,Result组件是用来展示操作结果或状态信息的。以下是ElementPlus中Result组件的详细介绍,以及如何在Vue3中使用它。由于Vue2没有该组件,我将只介绍Vue3下的使用。Vu......
  • 红队内网攻防渗透:内网渗透之内网对抗:横向移动篇&入口差异&切换上线&IPC管道&AT&SC任务
    红队内网攻防渗透1.内网横向移动1.1横向移动入口知识点1.1.1、当前被控机处于域内还是域外1.1.1.1在域内1.1.1.2不在域内1.1.1.2.1第一种方法提权到system权限1.1.1.2.2第二种方法切换用户上线1.1.1.2.3kerbrute枚举用户1.1.2、当前凭据为明......
  • 炭熄卡顿、延迟高、联机报错的解决方法一览
    炭熄在制作中巧妙地结合了程序随机生成的元素,为玩家呈现出了一个充满未知与惊险的开放世界,是一款独具匠心的中式民俗恐怖题材游戏。在这款游戏中,玩家将化身为一位意外闯入村子的青年,面对种种鬼怪、努力活下来。游戏将于6月24日登陆steam平台,为了获得最好的游戏体验,我们这就来一......
  • SpringBoot:SpringBoot集成Druid监控慢SQL
    一、前言  数据库连接池是一个至关重要的组成部分,一个优秀的数据库连接池可以显著提高应用程序的性能和可伸缩性。常见的连接池:Druid、HikariCP、C3P0、DBCP等等,不过目前大部分都是使用Druid或者SpringBoot默认的HikariCP!  本文将详细介绍如何在SpringBoot项目中配置......
  • Hbuilder创建项目,制作html网页第六天
    纹理切换更换图片中显示的内容,可以让元素中的内容产生变化元素与纹理varfeiji =newPIXI.Sprite.fromImage("img/plane1.png")feiji是图片元素, "img/plane.png"是纹理创建纹理vart1=newPIXI.Texture.fromImage("img/plane07.png")创建图片并添加纹理1、添加图片......
  • 【Proteus仿真】【Arduino单片机】井盖安全检测装置设计
    文章目录一、功能简介二、软件设计三、实验现象联系作者一、功能简介本项目使用Proteus8仿真Arduino单片机控制器,使用LCD1602液晶显示模块、WIFI模块、蜂鸣器、LED按键、ADC、角度/可燃气检测传感器等。主要功能:系统运行后,LCD1602显示井盖切斜角和阈值、可燃气浓......
  • WebView2UI - 在WPF之中使用WebView2的一些经验总结
    项目地址:https://gitee.com/skyw18/WebView2UI项目地址:https://github.com/skyw18/WebView2UIwebview简介与生命周期:WPF应用中的WebView2入门-MicrosoftEdgeDeveloperdocumentation|MicrosoftLearn具体代码可以参考微软官方示例文档WPF示例应用-MicrosoftEdge......