当前位置: 代码迷 >> C# >> 关于System.Timers.Timer控制主线程控件的有关问题
  详细解决方案

关于System.Timers.Timer控制主线程控件的有关问题

热度:467   发布时间:2016-05-05 05:32:49.0
关于System.Timers.Timer控制主线程控件的问题
我在程序中使用了Mschart这个控件的real time data的这个图表,而且一次性需要使用3个,程序运行起来以后发现很慢,想办法改进后发现可以使用System.Timers.Timer来处理,但是碰到的问题就是一直提示说线程间操作无效。后面上网查了下,可以使用委托,但是我这个timer中需要chart1,chart2,chart3使用不止1,2次,如果全部用网上的那个委托方法一个一个加的话感觉使用的代码量非常的长,请问有什么方法能够用简短的代码一次性处理掉这个问题么。。
比如
                   if (chart1.ChartAreas["Default1"].AxisX.Maximum < pointIndex)
                    {
                        chart1.ChartAreas["Default1"].AxisX.Maximum = pointIndex;
                    }
                    if (chart2.ChartAreas["Default2"].AxisX.Maximum < pointIndex)
                    {
                        chart2.ChartAreas["Default2"].AxisX.Maximum = pointIndex;
                    }
                    if (chart3.ChartAreas["Default3"].AxisX.Maximum < pointIndex)
                    {
                        chart3.ChartAreas["Default3"].AxisX.Maximum = pointIndex;
                    }
这样一段,如果一个个委托的话感觉很难啊。谢谢指点
------解决思路----------------------
线程中不要直接控制UI控件,你可以把数据算好,然后通过委托去通知UI更新
------解决思路----------------------

        public delegate DoProcess(Chart inputchart,int chartindex,int pointIndex);
        private void RefreshUI(Chart inputchart,int chartindex,int pointIndex)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new DoProcess(RefreshMainform), new object[]{inputchart,chartindex,pointIndex});
            }
            else
            {
                inputchart.ChartAreas["Default"+chartindex].AxisX.Maximum = pointIndex;
            }
        }

        public void threadDo()
        {
             if (chart1.ChartAreas["Default1"].AxisX.Maximum < pointIndex)
             {
                 RefreshUI(chart1, 1, pointIndex);
             }
            if (chart2.ChartAreas["Default2"].AxisX.Maximum < pointIndex)
            {
                RefreshUI(chart2, 2, pointIndex);
            }
            if (chart3.ChartAreas["Default3"].AxisX.Maximum < pointIndex)
            {
                RefreshUI(chart3, 3, pointIndex);
            }
        }
  相关解决方案