C#线程和轮询

C#线程和轮询,c#,C#,我有一个托盘图标,需要显示两个图标: 如果存在网络连接,则显示带复选标记的绿色圆圈 如果没有网络连接,则显示一个带有X的红色圆圈 因此,我得到的是: using System.Net.NetworkInformation; bool isConnected = NetworkInterface.GetIsNetworkAvailable() 因此,我正在考虑启动一个新线程或使用后台工作进程,因为托盘图标是NotifyIcon,它是一个组件,所以我不能使用: Form.Invoke(deleg

我有一个托盘图标,需要显示两个图标:

  • 如果存在网络连接,则显示带复选标记的绿色圆圈
  • 如果没有网络连接,则显示一个带有X的红色圆圈
  • 因此,我得到的是:

    using System.Net.NetworkInformation;
    
    bool isConnected = NetworkInterface.GetIsNetworkAvailable()
    
    因此,我正在考虑启动一个新线程或使用后台工作进程,因为托盘图标是NotifyIcon,它是一个组件,所以我不能使用:

    Form.Invoke(delegate, object[])
    
    更新NotifyIcon类的icon属性

    我最关心的是投票过程:我可以写一些逻辑:

    while (true) 
    {
        System.Threading.Thread.Sleep(1000);
        isConnected = NetworkInterface.GetIsNetworkAvailable();
        if (isConnected)
            notifyIcon.Icon = "ConnectedIcon.ico";
        else
            notifyIcon.Icon = "DisconnectedIcon.ico";
    }
    

    但我看过几篇文章告诉我远离睡眠(1000)。我似乎找不到那些文章,因为我没有给它们加书签。我只是想知道为什么在线程中进行轮询不是一个好主意。

    在您的情况下,使用Sleep方法完全可以

    你看到的可能是这样说的:最好使用a-from循环等等。

    轮询并不总是坏事,但如果可能的话,最好避免。如果我运行每秒轮询一次的应用程序,这意味着每秒有一次你的程序被安排在CPU核心上工作,而CPU核心99.9999%将是不可操作的。在桌面上这并不太糟糕,但想象一下笔记本电脑。那里的CPU尽可能在低功耗模式下运行,所以额外的CPU工作意味着更少的电池寿命!这就是为什么许多移动平台(iOS、WindowsPhone7等)禁止任意背景线程的原因,因为他们知道人们会滥用它们


    在您的情况下,有一种更简单的方法:只需使用
    System.Net.NetworkInformation.NetworkChange
    ,它在网络连接发生变化时提供事件。不需要投票

    您可以在
    NetworkChange
    上注册事件,以便在状态更改时收到通知:

    NetworkChange.NetworkAvailabilityChanged += new NetworkAvailabilityChangedEventHandler(NetworkChange_NetworkAvailabilityChanged);
    
    void NetworkChange_NetworkAvailabilityChanged(object sender, NetworkAvailabilityEventArgs e)  
    {
        if (e.IsAvailable) {
            Console.WriteLine("Network Available");
        } else {
            Console.WriteLine("Network Unavailable");
        }
    }
    

    这里没有理由投票,因为已经有了一个框架API,可以在网络连接发生变化时提供事件。在这个平台上烧掉像线程一样昂贵的东西没有什么意义。只要用定时器,请看