考虑一下这个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不会?
答案 0 :(得分:3)
您可以从参考源中发现这一点,同步提供程序由WindowsFormsSynchronizationContext.InstallIfNeeded()方法安装。查看引用以查看它何时被调用:
NotifyIcon派生自Component,而不是Control,因此永远不会击中这3个子弹中的一个。它是围绕Shell_NotifyIcon() winapi函数的薄包装器。我想你可以称之为它的构造函数没有调用InstallIfNeeded()的bug,但这有点紧张,你总是必须调用Application.Run()来使它运行起来所以你总是会这样做击中了第一颗子弹。请注意初始化顺序。