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

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

原先的调用方式

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;
        }

  

posted @ 2022-10-27 11:49  unicornsir  阅读(47)  评论(0编辑  收藏  举报