Мучаю примерчик с кодепроджекта ChatApplication на ремоутинге.
На форме есть RichTextBox richTextHistory.
Метод ReceiveText может вызываться из других потоков, поэтому пытаюсь использовать "потокобезопасную" схему через Invoke.
Так вот почему-то на this.Invoke всё и зависает. Никаких эксепшенов нету. Просто висим.
Хелп кто чем может!
public void ReceiveText(string username,string text)
{
if (this.richTextHistory.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { username, text });
}
else
{
SetText(username, text);
}
}
Здравствуйте, Arboz, Вы писали:
A>Здравствуйте, busybox, Вы писали:
B>>Хелп кто чем может!
A>Скорее всего, главный гуишный поток стоит. A>Посмотрите где стоит.
A>Могу предположить, см. метод SendMessage (или что-то в духе).
A>Угадал?
Стоит вот здесь
private void SendButton_Click(object sender, System.EventArgs e)
{
this.chatCenter.SendText(UserName,richTextMessage.Text); // вот тут мы и стоим!
this.richTextMessage.Clear();
}
Здравствуйте, busybox, Вы писали:
B>Стоит вот здесь B>private void SendButton_Click(object sender, System.EventArgs e) B>{ B> this.chatCenter.SendText(UserName,richTextMessage.Text); // вот тут мы и стоим! B> this.richTextMessage.Clear(); B>}
Ну вот — угадал .
Я просто сам когда-то тренировался. MyICQ на Remouting писал.
Дело вот в чем:
Вы делаете синхронный вызов chatCenter.SendText. Вызов делается в главном
(гуишном) потоке. Т.е. поток стоит до тех пор пока не выполнится SendText метод.
Далее сервер вызывает вас же (клиента) (ReceiveText) в другом потоке,
вы все правильно делаете, что проверяете InvokeRequired
и вызываете обращение к контролу через Invoke, но
главный-то поток стоит — выборки сообщений не производится.
т.е. вы получили, попросту говоря, deadlock.
Как побороть?
Сделайте Асинхронный вызов chatCenter.SendText.