.net - 为什么NotifyIcon不设置SynchronizationContext?

标签 .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 却不会?

最佳答案

这是您可以从引用源中找到的内容,同步提供程序是由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/

相关文章:

.net - 'TestString' 未声明。由于其保护级别,它可能无法访问。 (BC30451)

regex - 在 VB.net 中将管道分隔文件更改为逗号分隔

c# - 是否可以在 WinForms 中旋转按钮控件?

c# - UI 对长时间的 for 循环无响应

c# - (C#) 如何获取屏幕的点与像素关系?

.net - NHibernate:如何在运行时重新配置映射?

c# - 使用 .NET 获取上次 Windows 关闭事件的日期时间

c# - 自定义用户控件 - 如何添加类型为 Dictionary<int, Color> 的代码集合编辑器

asp.net - 设置一个asp :DropDownList的html 'name'属性

c# - VB.Net Power 运算符 (^) 从 C# 重载