private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{//обработчик приема байт
...//проверки всякие
this.button2_Click(this, null);// <--вот тут хочу вызвать ф-цию.
//возвращается ошибка
}
serialPort ?
Код:
вот ее содержание:
Цитата:
An unhandled exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll
Additional information: Cross-thread operation not valid: Control 'button2' accessed from a thread other than the thread it was created on.
заранее благодарен.
Такие вещи синхронизировать надо.
Код:
[SIZE=2][FONT=Courier New]button1.Invoke([/FONT][/SIZE][FONT=Courier New][SIZE=2][COLOR=#0000ff]new [/COLOR][/SIZE][SIZE=2][COLOR=#008080]EventHandler[/COLOR][/SIZE][SIZE=2](button1_Click), [/SIZE][SIZE=2][COLOR=#0000ff]this[/COLOR][/SIZE][SIZE=2], [/SIZE][SIZE=2][COLOR=#0000ff]new [/COLOR][/SIZE][SIZE=2][COLOR=#008080]EventArgs[/COLOR][/SIZE][SIZE=2]());[/SIZE][/FONT]
Т.е. происходит вызов synchronize-метода (т.е. он всегда синхронизирован и не может вызвать падение потока) Invoke у контрола button1, он принимает код, который будет выполнен в одном потоке с контролом. Далее передаю аргументы для вызова button1_Click - это источник сообщения и аргументы события.
Все заработало с вызовом:
Код:
button1.Invoke(new EventHandler(button1_Click), this, new EventArgs());
Цитата: faradey
Спасибо всем откликнувшимся. Я что-то подобное и думал, но сам бы не сделал...
Только учти, что подобный вызов останавливает поток, в котором опрашивается порт до окончания выполнения данного метода в UI-потоке. Для того, чтобы не ждать UI-поток (в случае, если код обработчика кнопки отнимает дополнительные ресурсы), используй button1.BeginInvoke.
Цитата: 3A3-968M
Только учти, что подобный вызов останавливает поток, в котором опрашивается порт до окончания выполнения данного метода в UI-потоке. Для того, чтобы не ждать UI-поток (в случае, если код обработчика кнопки отнимает дополнительные ресурсы), используй button1.BeginInvoke.
спасиб. попробовал так, все работает хоть я и не заметил особой разницы :)