【发布时间】:2013-07-23 16:56:40
【问题描述】:
我正在开发一个 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 的其他区域订阅了此事件 - 但是当登录表单冻结时,因为 @ 987654329@ 从不运行任何东西,就像它在运行之前一直在等待某事发生。
任何帮助或提示将不胜感激。
【问题讨论】:
-
所有你需要的是显示登录表单,如果用户按下登录显示主表单,否则取消它?
-
是的 - 并关闭登录表单。如果我在没有 syncContext 的情况下运行代码,我会得到一个关于试图从另一个线程调用 loginform 关闭函数的异常。
-
在事件被触发后,您是否
Wait正在处理 UI 线程中的某些内容?