当前位置: 代码迷 >> C# >> invalidate跟refreshd的区别
  详细解决方案

invalidate跟refreshd的区别

热度:65   发布时间:2016-05-05 02:38:48.0
invalidate和refreshd的区别
本帖最后由 u011672494 于 2015-09-25 14:55:17 编辑
在做zedgraph的实时刷新数据的时候,界面上只有一个zedgraph刷新时
  if (zg.InvokeRequired)
            {
                zg.BeginInvoke(new Action(() => {  zg.Refresh(); }));
            }
程序运行正常 zedgraph刷新也正常。

当我界面上放了两个zedgraph时,再用相同的方法,对两个zedgraph进行同步的采集数据刷新操作时  会发现运行一会儿 刷新卡顿,两者无法保持同步,界面有假死的现象。

 之后 把刷新方法改为:
  if (zg.InvokeRequired)
            {
                zg.BeginInvoke(new Action(() => {  zg.Invalidate(); }));
            }
这样的话  运行效果会好很多。。。但是过久一点 依然会卡顿现象。
不知道如何解决为好
 还是不清楚这两个到底区别在哪? 何时用invalidate or refresh。
代码如下:

  private void initZedGraph(ZedGraphControl zedgraph)
        {
            GraphPane myPane = zedgraph.GraphPane;
            if (zedgraph == zedGraphControl1)
            {
                myPane.Title.Text = "A";
                LineItem Curve1 = myPane.AddCurve("电压1", list1, Color.Yellow, SymbolType.None);
                LineItem Curve2 = myPane.AddCurve("电压2", list2, Color.Green, SymbolType.None);
                LineItem Curve3 = myPane.AddCurve("电压3", list3, Color.Red, SymbolType.None);

                Curve1.IsY2Axis = true;
                Curve2.IsY2Axis = true;
            }
            if (zedgraph == zedGraphControl2)
            {
                myPane.Title.Text = "B";
                LineItem Curve1 = myPane.AddCurve("电压1", list4, Color.Yellow, SymbolType.None);
                LineItem Curve2 = myPane.AddCurve("电压2", list5, Color.Green, SymbolType.None);
                LineItem Curve3 = myPane.AddCurve("电压3", list6, Color.Red, SymbolType.None);

                Curve1.IsY2Axis = true;
                Curve2.IsY2Axis = true;
            }
            myPane.XAxis.Title.Text = "时间";
            myPane.YAxis.Title.Text = "距离(μm)";//"电压值"; //
            myPane.XAxis.Scale.Max = 100;
            myPane.XAxis.Scale.Min = 0;
            myPane.XAxis.MajorTic.IsOpposite = false;
            myPane.XAxis.MinorTic.IsOpposite = false;
            myPane.YAxis.Scale.Max = 20;
            myPane.YAxis.Scale.Min = -20;
            myPane.YAxis.MajorTic.IsOpposite = false;
            myPane.YAxis.MinorTic.IsOpposite = false; //小刻度
            myPane.YAxis.Scale.Align = AlignP.Inside;

            myPane.Y2Axis.Title.Text = "电压值";
            myPane.Y2Axis.Scale.Max = 4;
            myPane.Y2Axis.Scale.Min = -4;
            myPane.Y2Axis.Scale.FontSpec.FontColor = Color.Black;
            myPane.Y2Axis.Title.FontSpec.FontColor = Color.Black;
            myPane.Y2Axis.MajorTic.IsOpposite = false;
            myPane.Y2Axis.MinorTic.IsOpposite = false;
            myPane.Y2Axis.Scale.Align = AlignP.Inside;
            myPane.Y2Axis.IsVisible = true;
            myPane.Chart.Fill = new Fill(Color.White, Color.SteelBlue, 45.0F);
            myPane.Legend.IsVisible = false;

            zedgraph.AxisChange();
            zedgraph.Refresh();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            initZedGraph(zedGraphControl1);
            initZedGraph(zedGraphControl2);
           Task t = new Task(new Action(sampling));
            t.Start();

        }
        private void sampling()
        {
            int itime = 0;
            while (true)
            {
                list1.Add((double)itime, 3);
                list2.Add((double)itime, 2);
                list3.Add((double)itime, itime);
                list4.Add((double)itime, 3);
                list5.Add((double)itime, 2);
                list6.Add((double)itime, 1);
                itime++;

                if(itime>1000000)
                {
                   itime=0;
                }
                if (itime >= 100)
                {
                    zedGraphControl1.GraphPane.XAxis.Scale.Min = (double)itime - 100;
                    zedGraphControl1.GraphPane.XAxis.Scale.Max = (double)itime;
                    RefreshGraph(zedGraphControl1);
                    zedGraphControl2.GraphPane.XAxis.Scale.Min = (double)itime - 100;
                    zedGraphControl2.GraphPane.XAxis.Scale.Max = (double)itime;
                    RefreshGraph(zedGraphControl2);
                }
            }
        }
        private delegate void RefreshDelegate();
        private void RefreshGraph(ZedGraphControl zg)
        {
            if (zg == null)
                return;
            //判断是否是非创建控件的线程调用控件
            if (zg.InvokeRequired)
            {
                zg.BeginInvoke(new Action(() => {  zg.Invalidate(); }));
            }
            else
            {
                zg.AxisChange();
                zg.Invalidate();
                zg.Refresh();
            }
        }


------解决思路----------------------
Invalidate 是告诉系统要刷新, 而另一个则是亲自刷新, 不同之处在于前者刷新时系统会寻找合理的时机,
比如当页面在后台的时候其实不会刷新.
------解决思路----------------------
你说的那个是什么 我不知道 
但是 对System.Windows.Forms.Control.Refresh()函数 的反编译 结果如下