我正在处理XMPP消息传递应用程序,并在用户成功登录时触发事件。订阅它的事件将关闭表单中的日志记录并打开主窗体。简单的东西 - 除了我必须使用SynchronizationContext来访问登录表单的Close()方法。
以下是它的工作原理:
private SynchronizationContext syncContext; //Global SynchronizationContext
登录表单的构造函数
InitializeComponent();
//set to current after initialization
syncContext = SynchronizationContext.Current;
//subscribe to the event
EventAggregator.GetEvent<ContactListReadyEvent>().Subscribe(LoginResultHandler);
最后触发ContactListReadyEvent时运行的函数
private void LoginResultHandler(ContactListReadyEventObject result)
{
// send to UI thread
syncContext.Send(new SendOrPostCallback(delegate
{
EventAggregator.GetEvent<ContactListReadyEvent>).Unsubscribe(LoginResultHandler);
mainFrm.Show();
mainFrm.Focus();
this.Close();
}), null);
}
此代码全部运行完美...大部分时间。但每隔一段时间登录表格就会冻结。
我设置了一些日志记录来查找位置,它会进入LoginResultHandler
,但永远不会在syncContext.Send
内运行。我想知道这是因为我应该使用syncContext.Post
,还是我应该使用WindowsFormsSynchronizationContext
而不是SynchronizationContext
。
我知道这不是很多可以解决的信息,其他一些可能有用的信息是这个事件正在使用该mainFrm的其他区域订阅 - 但是当登录表冻结它时因为{ {1}}永远不会运行任何东西,就像它在运行之前等待某事发生一样。
非常感谢任何帮助或提示。
答案 0 :(得分:0)
你不需要任何其他东西。在构造函数的主窗体中,在initializecomponent之前执行此操作。在您的登录表单中,您可以设置对话框结果= ok如果您按下确定或者如果他选择取消您可以设置dialogresult = cancel。
frmLogin login = new frmLogin();
if(login.ShowDialog() == DialogResult.Cancel)
this.Close();
InitializeComponent() //of your main form