我有一个需要显示两个图标的托盘图标:
所以我拥有的是:
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)。我似乎无法找到这些文章,因为我没有给它们添加书签。我只是想知道为什么在一个帖子中进行轮询不是一个好主意。
答案 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
,它为网络连接发生变化时提供事件。不需要投票!