2011-11-29 44 views
5

我有一个需要显示两个图标的托盘图标:C#线程和轮询

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

所以我有什么是:

using System.Net.NetworkInformation; 

bool isConnected = NetworkInterface.GetIsNetworkAvailable() 

所以我瘦

Form.Invoke(delegate, object[]) 

更新的NotifyIcon类的图标属性:启动一个新的线程或使用后台工作进度,因为托盘图标是一个NotifyIcon的是一个组成部分,所以我不能用的国王。

我的大问题是投票过程:我可以写一些逻辑,做:

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

,但我见过一对夫妇,告诉我从休眠(1000)远离物品。我似乎无法找到这些文章,因为我没有收藏它们。我只是好奇,想知道为什么这不是一个线程轮询的好主意。

+2

有在燃烧起来为这个线程昂贵的东西少点。只需使用计时器。 –

+0

请参阅http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be-removed-from-posts –

回答

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

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

你所看到的可能是这样说,它能够更好地使用Reset Event - 从循环等..

+0

没有理由在此进行轮询,因为已经有框架API当网络连接改变时提供事件。 –

0

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

在你的情况下,有一个更简单的方法:只需使用System.Net.NetworkInformation.NetworkChange,它提供网络连接更改时的事件。不需要轮询!