考虑这个 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()
- Control 类构造函数
- 调度 Begin/Invoke() 调用的辅助方法(不会发生)。
NotifyIcon 派生自 Component,而不是 Control,因此永远不会击中这 3 个项目符号之一。它是 Shell_NotifyIcon() 周围的薄 wrapper 。 winapi函数。我想你可以称它为错误,因为它的构造函数不调用 InstallIfNeeded() 但这有点牵强,你总是必须调用 Application.Run() 才能使其正常工作,这样你总是会击中第一颗子弹。请注意初始化顺序。
关于.net - 为什么NotifyIcon不设置SynchronizationContext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29965262/