首页 > 编程语言 >C#在调用UI刷新时启用了不同的线程,导致数据异常的解决方案

C#在调用UI刷新时启用了不同的线程,导致数据异常的解决方案

时间:2022-10-27 11:55:26浏览次数:43  
标签:c1FlexGrid1 rebarCol manucol C# ref 线程 UI mTargetRebar Data

将原先的刷新函数封装如下

原先的调用方式

public void RefreshGrid()
        {
            System.Diagnostics.Debug.WriteLine("CurrentThreadID:" + System.Threading.Thread.CurrentThread.ManagedThreadId);
            updateDataBtnOfLock();
            mUnReasonableRows?.Clear();
            rebarCollectionErrors?.Clear();
            this.warningCount.Text = "0";
            Data.Clear();
            this.c1FlexGrid1.Cols[9].Visible = TableRebarResultControl.ShouldConsiderBendAdjsutment();
            this.c1FlexGrid1.Rows.Count = 1;
            this.c1FlexGrid1.ClearFilter();
            this.totalWeight.Text = "单构件钢筋总重(kg):";
            if (mTargetRebar == null)
                return;
            mTargetRebar.ValidateCollections(ref rebarCollectionErrors);
            mTargetRebar.CollectRebars(ref Data);
            sortBarsByType(ref Data, mTargetRebar);
            if (Data == null)
                return;
            List<MRebarCollection> manucol = new List<MRebarCollection>();
            foreach (var rebarCol in Data)
            {
                if (rebarCol.HasFlag(MRebarCollection.Flag.ManualAdded))
                {
                    manucol.Add(rebarCol);
                    continue;
                }
                AddOneRowData(rebarCol);
            }
            foreach (var col in manucol)
            {
                AddOneRowData(col);
            }
        }

 修改:1、将原函数的访问权限降低为private,2、更名为_unsafe,3、包装一个新的函数提供外部调用

private void RefreshGrid_unsafe()
        {
            System.Diagnostics.Debug.WriteLine("CurrentThreadID:" + System.Threading.Thread.CurrentThread.ManagedThreadId);
            updateDataBtnOfLock();
            mUnReasonableRows?.Clear();
            rebarCollectionErrors?.Clear();
            this.warningCount.Text = "0";
            Data.Clear();
            this.c1FlexGrid1.Cols[9].Visible = TableRebarResultControl.ShouldConsiderBendAdjsutment();
            this.c1FlexGrid1.Rows.Count = 1;
            this.c1FlexGrid1.ClearFilter();
            this.totalWeight.Text = "单构件钢筋总重(kg):";
            if (mTargetRebar == null)
                return;
            mTargetRebar.ValidateCollections(ref rebarCollectionErrors);
            mTargetRebar.CollectRebars(ref Data);
            sortBarsByType(ref Data, mTargetRebar);
            if (Data == null)
                return;
            List<MRebarCollection> manucol = new List<MRebarCollection>();
            foreach (var rebarCol in Data)
            {
                if (rebarCol.HasFlag(MRebarCollection.Flag.ManualAdded))
                {
                    manucol.Add(rebarCol);
                    continue;
                }
                AddOneRowData(rebarCol);
            }
            foreach (var col in manucol)
            {
                AddOneRowData(col);
            }
        }

  经过包装后,现在对外调用的方式

public void RefreshGrid()
        {
            if (this.InvokeRequired)
                this.BeginInvoke(new Action(()=> RefreshGrid_unsafe()));
            else
                RefreshGrid_unsafe();

            return;
        }

  

标签:c1FlexGrid1,rebarCol,manucol,C#,ref,线程,UI,mTargetRebar,Data
From: https://www.cnblogs.com/unicornsir/p/16831717.html

相关文章

  • Scrum五大会议要怎么开?
    在Scrum框架中,我们对Scrum的五个会议一定都不陌生,但如何组织这五个会议,才能让Scrum团队真正积极、主动地参与进项目管理中呢?在Scrum框架中,我们对Scrum的五个会议一定......
  • CSS注册页面案例
    CSS注册页面案例使用CSS完成效果图片  代码实现: <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><style>......
  • TCP 端来链接为什么一定要等2MSL
    我们知道tcp传输中需要三次握手和四次挥手2MSL发生在挥手阶段原因保证可靠的TCP通讯安全的断开保证旧的的消息在网络消失安全断开我们知道一个IP包最大的声明......
  • Vue项目实现导入导出Excel表格功能
    前提:在我的项目中我使用的是ElementUi前端UI框架,用到的是里面的Upload上传组件。第一步:需要安装三个依赖npminstall-Sfile-saverxlsx (这里其实安装了2个......
  • 【leetcode插件】使用
    快捷键如图中的文档注释中的类,没有快捷键可以一次性取消,如果一行一行删又太费事,我们可以用这个方法。光标放在这里,按下Alt+鼠标左键,就可以对多行进行删除,简单方便。......
  • Springboot centos7 启动
     1、java-jardemo.jar说明:用这种方法启动后,不能继续执行其它命令了,如果想要继续执行其它命令,就都打断,打断一般用ctrl+c。2、java-jardemo.jar&第2种在第1种方式的......
  • nginxlocation优先级
    nginx反向代理一个server下配置多个location域名问题当你设置两个location/时,当然只会匹配第一个了。你的意思是不是要配置两个域名?server{listen80;server_namewww.1.com;......
  • 收集牛客网腾讯面试查漏补缺【threadlocal、explain、引用】
    一、ThreadLocal【解决共享变量】1.ThreadLocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量......
  • nginxkeepalived和tomcat整合
    最前面两台NGINX+keepalived可不可以同时承担WEB的高可用负载均衡和图片服务器并实现高可用?完全可以实现的nginx可以设置多个server,相互之间互不影响,用keepalived做负载的应......
  • docker安装nginx配置
    编译安装nginx的配置文件的路径在哪这个版本不同,位置还是不同的。我的是nginx-1.9.9版本源码安装,配置文件在conf这个目录里面:/usr/local/nginx/conf/nginx.conf如果你找不见......