Параллельно циклу для добавления точек в ряд, в результате чего индекс выходит за границы массива - PullRequest
0 голосов
/ 15 января 2019
int signal_length=1000_000;
double[] x=new double[signal_length];

var Signal = new Series
{
    IsVisibleInLegend = true,
    ChartType = SeriesChartType.Line,
    LegendText = "Original Signal",
};

var options = new ParallelOptions() { MaxDegreeOfParallelism = 4 };
Parallel.For(0, x.Length,options, i =>
{
  Signal.Points.AddY(x[i]);
});

chart.Series.Add(Signal);

Сообщение об ошибке:

System.IndexOutOfRangeException: 'Индекс находился за пределами массива.'

Я думаю, что эта ошибка возникает, поскольку параллельный цикл не атомарный
Я хочу что-то вроде «СНИЖЕНИЕ» в C ++

1 Ответ

0 голосов
/ 15 января 2019

Элемент управления диаграммы не является поточно-ориентированным. Вы не можете просто вызывать его функции из нескольких потоков параллельно.

Используйте метод DataBindY для добавления нескольких точек данных одновременно. Для повышения производительности методы DataBind* используют внутренне SuspendUpdates / ResumeUpdates, чтобы предотвратить перерисовку диаграммы во время добавления точек данных.

Невозможно улучшить производительность по сравнению с тем, как Microsoft реализовала свои DataBind* методы.


Измерение производительности:

double[] x = new double[1_000_000];
Random r = new Random();

for (int i = 0; i < x.Length; i++)
{
    x[i] = r.NextDouble();
}

var Signal = new Series
{
    IsVisibleInLegend = true,
    ChartType = SeriesChartType.Line,
    LegendText = "Original Signal",
};

DateTime start = DateTime.Now;

Signal.Points.DataBindY(x);

DateTime end = DateTime.Now;

MessageBox.Show((end - start).TotalMilliseconds.ToString());

Этот код показывает, что на моем компьютере требуется ~ 1600 мс для добавления точек данных с помощью DataBindY. Я не понимаю, как вы могли бы улучшить эту часть.

Если вы видите низкую производительность для фактического рисования диаграммы, вам придется искать улучшения, уменьшая количество точек данных. Например, ограничить количество точек в целом или включить только каждый n-й элемент данных.

...