c# - MSChart 更新 block worker thead

标签 c#

我正在使用 .NET 中的 Microsoft Chart 库。我正在尝试绘制硬件每 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 线程已经用完了。

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

我不太了解 Win Forms,但我认为这对他们来说也是正确的。

关于c# - MSChart 更新 block worker thead,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12851086/

相关文章:

时间:: how to read from specific index in List<person>

c# - 如何在不使用过时的 OracleConnection 类的情况下建立 OracleConnection

c# - 在 web.config 中注册 httpModules

c# - 倒计时通知线程延迟的最佳实践

c# - C# 的非接口(interface)依赖模拟框架

c# - 在多个文件中搜索多个字符串的 Grep 工具

c# - 确保 ServiceStack 服务的安全

c# - 继承和异常处理

c# - 在 DateTime 上动态过滤 ObjectQuery<T>

c# - window.external 上的无参数方法在使用 typeof 检查时被调用