Хорошо, вот как это сделать (безопасно).
Root причина:
Вы управляете коллекцией из фонового потока, который одновременно проходит через компонентом формы в главном потоке (UI).
Решение:
Чтобы безопасно добавить в коллекцию, вы должны сделать это в главном потоке. Windows Фреймворк форм предоставляет способы для достижения этой цели. Один из них следующий:
Подход, реализованный здесь, был проверен и доказал свою эффективность. (Точки, добавленные фоновым потоком, были успешно обработаны компонентом диаграммы)
Добавьте делегата, принимающего строковый параметр, в класс формы:
public delegate void OnSerialDataReceived(string pnt);
Добавьте метод, принимающий строковый параметр в вашем классе формы. Этот метод будет использоваться в качестве конкретной реализации делегата.
private void AddPointToChart(string pnt)
{
chart1.Series[0].Points.AddY(pnt);
}
Когда вы удаляете новые данные из вашей параллельной очереди, вместо добавления точки выполните следующее:
private void addPoint()
{
string pnt;
while (true)
{
if (!kuyruk.IsEmpty)
{
if (kuyruk.TryDequeue(out pnt))
{
// This will guarantee safe invocation of the target method
// on the UI thread
var safeInvoker = new OnSerialDataReceived(AddPointToChart);
chart1.Invoke(safeInvoker, pnt);
}
}
}
}
Это все.
Удачи.