Обновление диаграммы в режиме реального времени Операция кросс-потока недопустима

Kajetanoss спросил: 07 октября 2018 в 10:12 в: multithreading

Я пытаюсь создать графический интерфейс для своего приложения. Я застрял на одной проблеме. Я пытаюсь использовать таймер"OnTImedEvent", чтобы вызвать мою функцию для обновления графика. К сожалению, MVS выдает мне "Операция с несколькими потоками недопустима". Я наткнулся на несколько советов, касающихся того, что называется делегатом, но мне не удается заставить его работать. Так как я nooby в windowsFormsApp (началось сегодня), я прошу вашей помощи. Вот мой код:

using System;
using System.IO.Ports;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Timers;namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        bool state = false;
        private static System.Timers.Timer timer;
        public Form1()
        {
            InitializeComponent();
            timer = new System.Timers.Timer(10);
            timer.Elapsed += OnTimedEvent;
            timer.AutoReset = true;
            timer.Enabled = true;      
        }        private void button1_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                serialPort1.WriteLine("a\n");
            }
            else
                MessageBox.Show("Brak połączenia z urządzeniem");
        }        private void button4_Click(object sender, EventArgs e)
        {            if (serialPort1.IsOpen)
            {
                Form2 form2 = new Form2(serialPort1);
                form2.Show();
            }
            else
                MessageBox.Show("Brak połączenia z urządzeniem");
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            string[] ports = SerialPort.GetPortNames();
            comBoxPort.Items.AddRange(ports);
        }        private void btnCon_Click(object sender, EventArgs e)
        {
            if (state)
            {
                state = false;
                btnCon.ForeColor = Color.Red;
                try
                {
                    serialPort1.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    throw;
                }
            }
            else
            {
                state = true;
                btnCon.ForeColor = Color.Green;
                try
                {
                    serialPort1.PortName = comBoxPort.Text;
                    serialPort1.Open();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    throw;
                }
            }        }        private void btnRoll_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                serialPort1.WriteLine("s\n");
            }
            else
                MessageBox.Show("Brak połączenia z urządzeniem");
        }        private void btnYAW_Click(object sender, EventArgs e)
        {
            drawChart();
            if (serialPort1.IsOpen)
            {
                serialPort1.WriteLine("d\n");
            }
            //else
                //MessageBox.Show("Brak połączenia z urządzeniem");
        }
        private void drawChart()
        {
            chart1.Series["PITCH"].Points.AddY(21);
            chart1.Series["ROLL"].Points.AddY(122);
            chart1.Series["YAW"].Points.AddY(13);
        }
        public delegate void drawChartCallback();
        private void chart1_Click(object sender, EventArgs e)
        {        }        
        private void OnTimedEvent(Object source, ElapsedEventArgs e)
        {
            drawChart();
        }
    }
}

Заранее благодарен за помощь.

0 ответов