【问题标题】:Why does NotifyIcon not set SynchronizationContext?为什么 NotifyIcon 没有设置 SynchronizationContext?
【发布时间】:2015-04-30 10:25:55
【问题描述】:

考虑一下这个 WinForms 程序:

Module Main
    Dim notifyicon As New System.Windows.Forms.NotifyIcon
    'Dim dummycontrol As New System.Windows.Forms.Control

    Public Sub Main()
        If (System.Threading.SynchronizationContext.Current Is Nothing) Then
            MessageBox.Show("Nothing")
        Else
            MessageBox.Show("Something")
        End If
    End Sub
End Module

NotifyIcon 是一个 WinForm 控件,需要一个消息循环,那么为什么声明 dummycontrol(或任何 WinForms 控件)会设置 SynchronizationContext,而 NotifyIcon 却没有?

【问题讨论】:

  • NotifyIcon doesn't inherit from System.Windows.Forms.Control - 这会改变你问题的前提吗?
  • @JamesThorpe 谢谢;肯定是一个有说服力的观察,并解释了为什么它没有表现出与其他控件相同的行为,但我仍然很好奇为什么尽管如此不会设置上下文。

标签: .net vb.net winforms synchronizationcontext


【解决方案1】:

这是您可以从参考源中发现的,同步提供程序是通过WindowsFormsSynchronizationContext.InstallIfNeeded() 方法安装的。查看引用以了解何时调用:

  • Application.Run()
  • Control 类构造函数
  • 调度 Begin/Invoke() 调用的辅助方法(不会发生)。

NotifyIcon 派生自 Component,而不是 Control,因此永远不会击中这 3 个项目符号中的一个。它是Shell_NotifyIcon() winapi 函数的薄包装。我想你可以称它为错误,它的构造函数没有调用 InstallIfNeeded() 但这有点牵强,你总是必须调用 Application.Run() 以使其正常工作,这样你总是会击中第一个子弹。请注意初始化顺序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-08
    • 2015-01-04
    • 2012-05-23
    • 1970-01-01
    • 2021-03-05
    • 2016-04-06
    • 1970-01-01
    相关资源
    最近更新 更多