为什么 NotifyIcon 不设置 SynchronizationContext?

Why does NotifyIcon not set SynchronizationContext?

考虑这个 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 却没有?

这是你可以从参考源中发现的东西,同步提供程序是通过WindowsFormsSynchronizationContext.InstallIfNeeded()方法安装的。看参考资料看看是什么时候调用的:

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

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