【问题标题】:Why isn't my SynchronizationContext.Current.Send working sometimes?为什么我的 SynchronizationContext.Current.Send 有时不工作?
【发布时间】: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 线程中的某些内容?

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


【解决方案1】:

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

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

InitializeComponent() //of your main form

【讨论】:

  • 我需要同步上下文 - 这也发生在另一个区域,它也需要同步上下文并且也在监听相同的事件(我可能应该在问题中包含它,我会更新它现在),我正在尝试同时解决这两个问题。它并不像使用对话结果那么简单(如果用户按确定但密码错误,或者无法检索联系人列表或没有互联网连接怎么办)。之后必须关闭。
  • 您可以在登录表单上处理所有用于登录的备用方案。就像 ok 一样,您可以发送调用登录,如果成功,则使用 dialogresult.ok 关闭,否则向用户显示登录失败的消息。
猜你喜欢
  • 2017-10-14
  • 1970-01-01
  • 1970-01-01
  • 2014-03-28
  • 2014-05-17
  • 2017-09-20
  • 2012-04-14
  • 2016-09-15
  • 2012-02-14
相关资源
最近更新 更多