2

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

4

1 回答 1

3

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

  • 应用程序运行()
  • 控制类构造函数
  • 调度 Begin/Invoke() 调用的辅助方法(不会发生)。

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

于 2015-04-30T11:55:31.537 回答