Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Error: Cross-thread operation not valid 
:(
    Опции темы
Barabeo
Дата 1.6.2011, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 2.10.2010

Репутация: нет
Всего: нет



Есть клиент-сервер.
Клиент получает ARP-кэш , выводит у себя в richTextBox и отсылает его на сервер. На сервере сообщение должно отобразиться тоже в richTextBox.
Но выпадает exception:
Цитата

Cross-thread operation not valid: Control 'richTextBoxReceivedMsg' accessed from a thread other than the thread it was created on.


Вот на этой строке:
Код

richTextBoxReceivedMsg.AppendText(szData);


Сервер:
Код

public  void OnDataReceived(IAsyncResult asyn)
        {
            try
            {
                SocketPacket socketData = (SocketPacket)asyn.AsyncState ;

                int iRx  = 0 ;
                // Complete the BeginReceive() asynchronous call by EndReceive() method
                // which will return the number of characters written to the stream 
                // by the client
                iRx = socketData.m_currentSocket.EndReceive (asyn);
                char[] chars = new char[iRx];
                System.Text.Decoder d = System.Text.Encoding.ASCII.GetDecoder();
                int charLen = d.GetChars(socketData.dataBuffer, 
                                         0, iRx, chars, 0);
                System.String szData = new System.String(chars);
                richTextBoxReceivedMsg.AppendText(szData);
                
                tt.Write(szData);
                // Continue the waiting for data on the Socket
                WaitForData( socketData.m_currentSocket );
            }
            catch (ObjectDisposedException )
            {
                System.Diagnostics.Debugger.Log(0,"1","\nOnDataReceived: Socket has been closed\n");
            }
            catch(SocketException se)
            {
                MessageBox.Show (se.Message );
            }
        }


Клиент:
Код

public  void OnDataReceived(IAsyncResult asyn)
        {
            try
            {
                SocketPacket theSockId = (SocketPacket)asyn.AsyncState ;
                int iRx  = theSockId.thisSocket.EndReceive (asyn);
                char[] chars = new char[iRx +  1];
                System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();
                int charLen = d.GetChars(theSockId.dataBuffer, 0, iRx, chars, 0);
                System.String szData = new System.String(chars);
                richTextRxMessage.Text = richTextRxMessage.Text + szData;
                StreamWriter tt = new StreamWriter("out.txt", true);
                tt.Write(szData);
                tt.Close();
                WaitForData();
            }
            catch (ObjectDisposedException )
            {
                System.Diagnostics.Debugger.Log(0,"1","\nOnDataReceived: Socket has been closed\n");
            }
            catch(SocketException se)
            {
                MessageBox.Show (se.Message );
            }
        }    

PM MAIL   Вверх
jonie
Дата 1.6.2011, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



вам нужен маршалинг в UI поток (где создан richtextbox). 
Вот тут подробнее: http://weblogs.asp.net/justin_rogers/pages/126345.aspx
ну и в гугле тонна информации на эту тему


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Barabeo
Дата 2.6.2011, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 2.10.2010

Репутация: нет
Всего: нет



Можно немного поподробней, а то я чето не могу понять что мне нужно сделать

Добавлено через 4 минуты и 55 секунд
Ну вот нашел похожее на форуме но как это влепить в мой код?

Код

void finder_FileFound(object sender, FileFoundEventArgs e)
{
    if (listBoxFiles.Dispatcher.Thread == Thread.CurrentThread)
    {
        listBoxFiles.Items.Add(e.File);
    }
    else
    {
        listBoxFiles.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,
            new EventHandler<FileFoundEventArgs>(finder_FileFound), sender, new object[] { e } );
    }
}


Вот эта тема:

Взаимодействие потоков при асинхронном исполнении

Добавлено через 9 минут и 51 секунду
Так что ли:
Код


    if (richTextBoxReceivedMsg.Dispatcher.Thread == Thread.CurrentThread)
    {
        richTextBoxReceivedMsg.AppendText(szData);
    }
    else
    {
        richTextBoxReceivedMsg.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,
            new EventHandler<FileFoundEventArgs>(finder_FileFound), sender, new object[] { e } );
    }

PM MAIL   Вверх
jonie
Дата 2.6.2011, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



Barabeo, приведенный вами код для WPF, а у вас наверно WinForms проект.
в MSDN все расписано вроде бы: http://msdn.microsoft.com/en-us/library/ms171728.aspx

вы гуглили?) только признайтесь честно... лень писать по 1000 раз одно и тоже - тема-то изъезженная


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Barabeo
Дата 3.6.2011, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 2.10.2010

Репутация: нет
Всего: нет



Интересно, почему когда я запускаю готовые exe-шники (не в VS), всё передается без проблем?
PM MAIL   Вверх
jonie
Дата 3.6.2011, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



Barabeo, на самом деле с проблемами, просто они до поры до времени не дают о себе знать.

вот тут читайте тему: http://forum.vingrad.ru/index.php?showtopi...t&p=2357125
это в точности ваш случай.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




[ Время генерации скрипта: 0.0569 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.