Thread и Form.Show () - PullRequest
       4

Thread и Form.Show ()

0 голосов
/ 25 июля 2010

Кажется, у меня проблемы с многопоточностью.

Сначала позвольте мне объяснить, как создается приложение.

У меня есть класс, расширяющий ApplicationContext, который является моим основным классом для всегоприложение, в этом классе я загружаю новые окна, такие как окно входа в систему.

Затем каждое окно говорит назад и вперед с классом контекста приложения.

У меня есть метод, который используется для открытияновое окно сообщения, вот оно.

public void InitiateChat(RosterItem Roster)
        {
            MessageWindow MessageWindow;
            if (WindowManager.ContainsKey(Roster.Jid.Bare) == false)
            {
                MessageWindow = new MessageWindow(Roster);
                MessageWindow.FormClosing += new FormClosingEventHandler(MessageWindow_FormClosing);

                //Store it.
                WindowManager.Add(Roster.Jid.Bare, MessageWindow);
            }
            else
            {
                MessageWindow = WindowManager[Roster.Jid.Bare];
            }

            if (MessageWindow.InvokeRequired)
            {
                MessageWindow.BeginInvoke(new InitiateChatDelegate(InitiateChat), new Object[] { Roster });
                return;
            }

            if (MessageWindow.WindowState == FormWindowState.Minimized)
            {
                MessageWindow.WindowState = FormWindowState.Normal;
            }
            MessageWindow.Show();
            MessageWindow.Activate();
        }

Теперь, когда я запускаю следующий код из события OnClick в главном окне мессенджера, он работает нормально:

RosterItem RosterItem = GetSelectedContact();
if (RosterItem != null)
{
    Messenger.Bootload.MessengerApplication.Instnace.InitiateChat(RosterItem);
}

Окно работает отлично, но так как это приложение для обмена сообщениями, основанное на XMPP и agsXMPP, у меня есть событие, которое вызывается agsXMPP с именем OnMessage, которое отправляет мне уведомление о получении входящего сообщения.

Вот этот метод.*

public void ClientConnection_OnMessage(Object Sender, agsXMPP.protocol.client.Message Message) 
{
    //Load the contacts Window
    RosterItem RosterItem = ContactManager[Message.From.Bare];
    if (RosterItem != null)
    {
         InitiateChat(RosterItem);
    }
}

Проблема в том, что когда выходит сообщение, я запускаю метод InitiateChat, но он зависает: (

Это MessageWindow.Show () tшляпы не могут работать нормально

Кто-нибудь может помочь мне заставить это работать, я пытаюсь сделать это в течение нескольких дней.

Ответы [ 2 ]

4 голосов
/ 25 июля 2010

Ваш обработчик события OnMessage работает в фоновом потоке.Это часто встречается в коде, ориентированном на сокеты.Много проблем с этим потоком, он не запускает цикл сообщений и завершает работу.Две причины делают форму кататонической.

Вы должны будете перенаправить вызов метода создания формы в поток пользовательского интерфейса.Обычно это делается с помощью Control.BeginInvoke ().Немного сложно в вашем случае, поскольку у вас нет очевидного объекта Form, который мог бы выступать в качестве поставщика BeginInvoke.Вы должны будете использовать метод System.Threading.SynchronizationContext.Current.Post ().Я оставлю это в качестве упражнения, использование основного окна вместо ApplicationContext было бы более простым путем.

2 голосов
/ 25 июля 2010
   if (MessageWindow.InvokeRequired)
   {
       MessageBox.Show("Invoking Window");
       MessageWindow.BeginInvoke(new InitiateChatDelegate(InitiateChat), 
           new Object[] { Roster });
       return;
   }

Вы вызываете MessageBox из другой ветки. Это не сработает.

Просто замените MessageBox.Show(...) на System.Diagnostics.Debug.Print () или что-то подобное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...