为什么我的SynchronizationContext.Current.Send有时不工作?

时间:2013-07-23 16:56:40

标签: c# .net winforms c#-4.0

我正在处理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}}永远不会运行任何东西,就像它在运行之前等待某事发生一样。

非常感谢任何帮助或提示。

1 个答案:

答案 0 :(得分:0)

你不需要任何其他东西。在构造函数的主窗体中,在initializecomponent之前执行此操作。在您的登录表单中,您可以设置对话框结果= ok如果您按下确定或者如果他选择取消您可以设置dialogresult = cancel。

frmLogin login = new frmLogin();
if(login.ShowDialog() == DialogResult.Cancel)
  this.Close();

InitializeComponent() //of your main form