C#线程和轮询
我有一个托盘图标,需要显示两个图标:C#线程和轮询,c#,C#,我有一个托盘图标,需要显示两个图标: 如果存在网络连接,则显示带复选标记的绿色圆圈 如果没有网络连接,则显示一个带有X的红色圆圈 因此,我得到的是: using System.Net.NetworkInformation; bool isConnected = NetworkInterface.GetIsNetworkAvailable() 因此,我正在考虑启动一个新线程或使用后台工作进程,因为托盘图标是NotifyIcon,它是一个组件,所以我不能使用: Form.Invoke(deleg
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,可以在网络连接发生变化时提供事件。在这个平台上烧掉像线程一样昂贵的东西没有什么意义。只要用定时器,请看