为什么NotifyIcon没有设置SynchronizationContext?

时间:2015-04-30 10:25:55

标签: .net vb.net winforms 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不会?

1 个答案:

答案 0 :(得分:3)

您可以从参考源中发现这一点,同步提供程序由WindowsFormsSynchronizationContext.InstallIfNeeded()方法安装。查看引用以查看它何时被调用:

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

NotifyIcon派生自Component,而不是Control,因此永远不会击中这3个子弹中的一个。它是围绕Shell_NotifyIcon() winapi函数的薄包装器。我想你可以称之为它的构造函数没有调用InstallIfNeeded()的bug,但这有点紧张,你总是必须调用Application.Run()来使它运行起来所以你总是会这样做击中了第一颗子弹。请注意初始化顺序。