какаято ошибка при вызове метода

Sasha Bilyck
Дата: 26.05.2006 19:39:32
Моя програма отлавливает события Remoting. Если запускаю скомпилированые файлы- все нормально; если запускаю через ВС2005 - выдайот ошибку на методе который обрабатываес событие в строке:

public void OnReciveMessage(string Sender, string Reciver, string Message )
{
this.ChatRoom_textBox.Text += "\r\n" + "Sender: " + Sender + "; Reciver: " + Reciver + "; Message: ;" + Message;//выбивает: InvalidOperationExeption was unhandled by user code; Cross-thread operation not valid: Control 'ChatRoom_textBox' accessed from a thread other than the thread it was created on.
MessageBox.Show("Sender: " + Sender + "; Reciver: " + Reciver + "; Message: ;" + Message);// срабатывает нормально
}

и самое интересное, что сначала все работало нормально, потом иногда начало выбивать, а теперь постоянно выбивает. Что это такое и как с ним боротся?
Лиман Артём
Дата: 26.05.2006 20:01:22
не знаю почему не ругаеца скомпилированная версия, но появление ошибки вполне логично.
Я так предполагаю (судя по тексту исключения), что функция OnReciveMessage вызываеца асинхронно, тоесть не в основном потоке. А в вин формс программирование существует такое правило: любые манипуляции с контролами, которые влияют на визульное отображение необходимо проводить в том потоке, в котором этот контрол был создан.
Так вот, в твоем случае тебе необходимо синхронизироваться с основным потоком формы. Это можна сделать вызвав Control.Invoke функцию, которая как раз этим и занимаеца. Код может быть примерно такой:

delegate void UpdateTextCallback(string aText)

private void UpdateText(string aText)
{
this.ChatRoom_textBox.Text += aText;
}


public void OnReciveMessage(string Sender, string Reciver, string Message )
{
this.Invoke(new UpdateTextCallback(UpdateText), new object[] {"\r\n" 
     + "Sender: " + Sender + "; Reciver: " + Reciver + "; Message: ;" + Message});
MessageBox.Show("Sender: " + Sender + "; Reciver: " + Reciver + "; Message: ;" + 
Message);// срабатывает нормально
}
_______________________________________________________
Never ask users what they want, or they'll tell you.
Картинка с другого сайта.
Sasha Bilyck
Дата: 26.05.2006 20:08:28
Спасибо добрый человек. Но зачем майкрософтцы зелали столько много лишнего кода? Ведь если сравнивать с Делфи то там нет розбиения на потоки (если я правильно выражаюсь)
Лиман Артём
Дата: 26.05.2006 20:46:01
Ведь если сравнивать с Делфи то там нет розбиения на потоки

тоесть нет? есть же класс TThread. И кстати правило на счет изменения свойств контрола в другом потоке там такие же. Если не изменяет память то у этого класс должен быть метод Synchronize() аналогичный Control.Invoke в .net

_______________________________________________________
Never ask users what they want, or they'll tell you.
Картинка с другого сайта.