Я создал программу-образец, которая генерирует каждые 2000 целых чисел в фоновом потоке, а когда она заканчивается, запускается событие, которое рисует график в графическом интерфейсе из случайных сгенерированных данных (у меня есть спать внутри моей нити, чтобы имитировать реальное измерение).Доступ к графическому интерфейсу из фонового потока
private void SetChart(System.Windows.Forms.DataVisualization.Charting.Series series)
{
if (InvokeRequired)
{
SetChartCallback d = new SetChartCallback(SetChart);
this.Invoke(d, new object[] { series });
}
else
{
chart1.Series[0] = series;
chart1.Series[0].Name = "Generated Data";
}
}
Я нашел этот подход на сайте MSDN. Он работает нормально, единственная проблема заключается в закрытии приложения. Иногда появляется сообщение об ошибке:
Невозможно получить доступ к расположенному объекту.
Название объекта: 'Form1'.
Когда я закрываю программу, она располагает всеми элементами, как я могу предотвратить эту ошибку?
Рекомендованный подход заключается в том, чтобы не закрывать форму до тех пор, пока все ваши фоновые потоки не будут завершены. например отключить закрытое масло или переопределить событие закрытия, чтобы сообщить пользователю, что что-то в данный момент происходит в фоновом режиме, и повторить попытку позже. В противном случае, если вы закроете форму, она исчезнет, пока фоновая обработка все еще происходит ... –
Теперь я проверяю значение Thread.IsAlive boolean, но если он возвращает true, и я вызываю thread.Join() - программу зависает и ничего не происходит. – patex1987
Где вы называете thread.join? если вы назовете это в конце формы, он будет блокироваться до тех пор, пока ваш фоновый поток не завершится - это то, что делает Join. –