Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MSChart更新块工作线程_C# - Fatal编程技术网

C# MSChart更新块工作线程

C# MSChart更新块工作线程,c#,C#,我正在使用.NET中的Microsoft图表库。我试图绘制从硬件每隔10毫秒生成的数据。这通常很好,除非我移动主窗体。然后更新图表会阻止工作线程。请参见所附代码,以模拟数据为例 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using

我正在使用.NET中的Microsoft图表库。我试图绘制从硬件每隔10毫秒生成的数据。这通常很好,除非我移动主窗体。然后更新图表会阻止工作线程。请参见所附代码,以模拟数据为例

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Threading;

namespace ChartTest
{
    public partial class Form1 : Form
    {
        private Worker _worker;
        double oldData;

        public Form1()
        {
            InitializeComponent();
            oldData = 0.0;
            _worker = new Worker();
            _worker.NewDataEvent += new EventHandler(_worker_NewDataEvent);
        }

        void _worker_NewDataEvent(object sender, EventArgs e)
        {
            double data = _worker.GetData();
            Add(data - oldData);
            oldData = data;
        }

        private delegate void AddDelegate(double data);

        public void Add(double data)
        {
            if (chart1.InvokeRequired)
            {
                chart1.Invoke(new AddDelegate(Add), data);
            }
            else
            {
                chart1.Series[0].Points.AddY(data);
            }
        }

        private void btnGo_Click(object sender, EventArgs e)
        {
            _worker.Start();
        }
    }

    public class Worker
    {
        private double data;
        Stopwatch st;
        bool running;

        public Worker()
        {
            data = 0.0;
            st = new Stopwatch();
            running = false;
        }

        public event EventHandler NewDataEvent;

        public void Start()
        {
            running = true;
            Thread t = new Thread(Run);
            t.Start();
        }

        private void Run()
        {
            st.Start();
            while (running)
            {
                Thread.Sleep(10);
                data = (double)st.ElapsedTicks / (double)Stopwatch.Frequency;
                NewDataEvent(this, null);
            }
        }

        public double GetData()
        {
            return data;
        }
    }
}
注:如有必要,我可以提供设计器代码

Worker类运行一个线程,该线程每10毫秒生成一些数据。它引发一个事件,Form1使用该事件调用图表中的更新。这通常是好的,除非UI呈现出现延迟,例如拖动表单。如果worker的Run()函数是时间关键型的,则这是有问题的。有没有办法在不阻塞线程的情况下尽快更新图表

如果这意味着图表有时需要20毫秒才能更新,那就好了。我只是希望它能尽快更新。谢谢。

(我想这是WPF,你的图表只是在添加点,而不是一个包含更奇特部分(如填充区域)的图表):

每10毫秒意味着您每秒添加100个图形对象,如果您的应用程序保持打开状态1分钟,则您的图表中至少包含6000个图形对象,并且当您移动主窗口时,UI需要重新绘制至少6000个图形对象!我想这是意料之中的!现在添加区域、颜色、厚度和其他内容。。。UI线程实际上已经耗尽

我认为首先使用某种数学过程(分析或统计过程,如插值)来产生有意义的采样,然后绘制它们更合适

我不知道胜利的形式,但我认为这对他们来说也是正确的