我似乎遇到了线程问题。Thread和Form.Show()
首先让我解释一下应用程序是如何构建的。
我有一个扩展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();
}
现在,当我在Messenger主窗口中运行从一个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()这就是不能运行良好
任何人可以帮我拿这个工作,我一直试图做几天现在
是的,我认为尽可能多的关于后台线程,所以基本上你的话是它不是我的应用程序类试图设置形式其实后台线程,我没有线索关于当前。 Post()实体,请尝试查看它。有没有一些例子,你可以链接到关于从bg线程初始化/调用表单? - 你的信息非常有用 – RobertPitt 2010-07-25 17:58:37
如果你真的必须使用Application.OpenForms [0] .BeginInvoke()。 – 2010-07-25 18:16:29