C#线程和轮询

时间:2011-11-29 07:09:02

标签: c#

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

  1. 如果有网络连接,请显示带有复选标记的绿色圆圈
  2. 如果没有网络连接,请显示带有X
  3. 的红色圆圈

    所以我拥有的是:

    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)。我似乎无法找到这些文章,因为我没有给它们添加书签。我只是想知道为什么在一个帖子中进行轮询不是一个好主意。

3 个答案:

答案 0 :(得分:4)

您可以在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");
    }
}

答案 1 :(得分:1)

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

你所看到的可能是这么说使用Reset Event - 从循环等方面更好......

答案 2 :(得分:0)

轮询不是总是邪恶,但如果可能的话,最好避免。如果我运行每秒轮询一次的应用程序,这意味着每秒一次,您的程序将被安排在CPU核心上工作,99.9999%将成为无操作。在一个不太可怕的桌面上,但想象一台笔记本电脑。那里的CPU尝试尽可能以非常低的功耗模式运行,因此额外的CPU工作意味着更少的电池寿命!这就是许多移动平台(iOS,Windows Phone 7等)禁止任意后台线程的原因,因为他们知道人们会滥用它们。

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