Зависаю на Invoke
От: busybox  
Дата: 27.04.06 08:58
Оценка:
Мучаю примерчик с кодепроджекта 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);
}
}

public void SetText(string username, string text)
{
this.richTextHistory.AppendText(username);
this.richTextHistory.AppendText(" : ");
this.richTextHistory.AppendText(text);
this.richTextHistory.AppendText("\n");
}
Re: Зависаю на Invoke
От: Arboz Россия  
Дата: 27.04.06 09:10
Оценка:
Здравствуйте, busybox, Вы писали:

B>Хелп кто чем может!


Скорее всего, главный гуишный поток стоит.
Посмотрите где стоит.

Могу предположить, см. метод SendMessage (или что-то в духе).

Угадал?
Re[2]: Зависаю на Invoke
От: busybox  
Дата: 27.04.06 09:52
Оценка:
Здравствуйте, 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();
}
Re[3]: Зависаю на Invoke
От: Arboz Россия  
Дата: 27.04.06 10:02
Оценка: 4 (1)
Здравствуйте, 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.
Re[4]: Зависаю на Invoke
От: busybox  
Дата: 27.04.06 10:16
Оценка:
Здравствуйте, Arboz, Вы писали:

A>Как побороть?

A>Сделайте Асинхронный вызов chatCenter.SendText.

Будь другом, подскажи плиз, как этот асинхронный вызов сделать?
Re[5]: Зависаю на Invoke
От: busybox  
Дата: 27.04.06 10:38
Оценка: 4 (1)
Здравствуйте, busybox, Вы писали:

B>Здравствуйте, Arboz, Вы писали:


A>>Как побороть?

A>>Сделайте Асинхронный вызов chatCenter.SendText.

B>Будь другом, подскажи плиз, как этот асинхронный вызов сделать?


Вопрос снят! BeginInvoke
Зависаю на Invoke
От: Аноним  
Дата: 27.04.06 09:46
Оценка:
Лично я делал следующее:

у меня был event, который вызывался из других потоков.

private void OnWrite(object sender, string xml)
{
if(InvokeRequired)
{
BeginInvoke(new WriteHandler(OnWrite), new object[] {sender, xml});
return;
}

// здесь код самого ивента
}

примечание — OnWrite — ивент типа WriteHandler.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.