C# 检测互联网空闲时间
如何使用C#检测internet空闲时(无下载/上载),并在空闲时启动下载?如果您正在等待没有连接的时刻。。。你必须知道,即使你认为自己没有使用互联网,也有很多联系 试着看一看和(从SysitGenerals)有一个想法C# 检测互联网空闲时间,c#,idle-processing,C#,Idle Processing,如何使用C#检测internet空闲时(无下载/上载),并在空闲时启动下载?如果您正在等待没有连接的时刻。。。你必须知道,即使你认为自己没有使用互联网,也有很多联系 试着看一看和(从SysitGenerals)有一个想法 非工作交通 注意:如果您通过Mono在Mac或Linux上使用.NET,您应该知道此API无法很好地移植到其他操作系统。所以,我在这里描述的只是Windows 如果你想了解交通状况,你可以尝试使用 您可以这样做,如下所示: var properties = IPGlobalP
非工作交通 注意:如果您通过Mono在Mac或Linux上使用.NET,您应该知道此API无法很好地移植到其他操作系统。所以,我在这里描述的只是Windows 如果你想了解交通状况,你可以尝试使用 您可以这样做,如下所示:
var properties = IPGlobalProperties.GetIPGlobalProperties();
// IPGlobalStatistics for IPv4
var ipv4stat = properties.GetIPv4GlobalStatistics();
// IPGlobalStatistics for IPv6
var ipv6stat = properties.GetIPv6GlobalStatistics();
从:
可以上网吗? 如果您需要在互联网可用时收到通知,您可以订阅。。这样,如果Internet连接或断开连接,您将收到一个通知事件(不要忘记取消订阅) 例如:
var handler = new NetworkAddressChangedEventHandler
(
(sender, args) =>
{
//handle notification
}
);
System.Net.NetworkInformation.NetworkChange += handler;
// Unsubscribe:
System.Net.NetworkInformation.NetworkChange -= handler;
NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();
foreach (var adapter in adapters)
{
// Is Up, Down, something else?
Console.WriteLine(" {0} is {1}", adapter.Name, dapter.OperationalStatus);
var stats = adapter.GetIPStatistics();
// Read some properties
Console.WriteLine(" Bytes Recieved: {0}", stats.BytesReceived);
Console.WriteLine(" Bytes Sent: {0}", stats.BytesSent);
}
您可能有兴趣了解哪些网络适配器处于开启或关闭状态,以及每个适配器有多少流量。。。关于这一点,见下文
空闲时间 让我们定义“空闲”。我会说“空闲”意味着互联网是可用的(检查上面),如果它在给定的时间内没有被使用 因此,您要做的另一件事是调用,它将为您提供一个数组,您可以在该数组上调用该方法来获取特定netowork接口的IPStatistics对象。您还可以读取属性以了解特定接口是否已启动 例如:
var handler = new NetworkAddressChangedEventHandler
(
(sender, args) =>
{
//handle notification
}
);
System.Net.NetworkInformation.NetworkChange += handler;
// Unsubscribe:
System.Net.NetworkInformation.NetworkChange -= handler;
NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();
foreach (var adapter in adapters)
{
// Is Up, Down, something else?
Console.WriteLine(" {0} is {1}", adapter.Name, dapter.OperationalStatus);
var stats = adapter.GetIPStatistics();
// Read some properties
Console.WriteLine(" Bytes Recieved: {0}", stats.BytesReceived);
Console.WriteLine(" Bytes Sent: {0}", stats.BytesSent);
}
您需要做的是以您可以查询的方式存储此信息,以检查其是否已更改:
// Fields
Dictionary<string, Tuple<long, long>> data
= new Dictionary<string, Tuple<long, long>>();
bool IsInternetIdle()
{
bool idle = true;
NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();
foreach (var adapter in adapters)
{
var stats = adapter.GetIPStatistics();
Tuple<long, long> info;
if (!data.TryGetValue(adapter.Name, out info))
{
//New Adapter
info = new Tuple<long, long>
(
stats .BytesReceived,
stats .BytesSent
);
data.Add(adapter.Name, info);
}
else
{
if
(
info.Item1 != stats .BytesReceived
|| info.Item2 != stats .BytesSent
)
{
idle = false;
break;
}
}
}
//Console.WriteLine("Is Idle: {0}", idle.ToString());
return idle;
}
用法示例:
GetInternetIdleTime(); //preemptive call
Thread.Sleep(1000);
var result = GetInternetIdleTime();
if (result.HasValue)
{
Console.WriteLine("Idle time: {0}", result.Value);
}
else
{
Console.WriteLine("Not Idle");
}
Console.ReadKey();
警告语
是Internetile
(如上所述),所有网络适配器都是新的。在声明使用它们之前,您可能需要先调用GetInternetIdleTime
(如上所述)IsInternetIdle
和GetInternetIdleTime
仅在Internet可用时使用。您可以添加检查以查看各个网络适配器是否已启动GetInternetIdleTime
的结果不是连接处于非活动状态的总时间,而是自发现连接处于非活动状态以来的时间。您可能需要在计时器中调用GetInternetIdleTime
(当然,如果您的应用程序有一个主循环,比如说,它是一个游戏,您可以使用给定的频率调用它)可供替代的 因为这是针对Windows的,所以您可以尝试使用网络适配器信息,我将通过Mladen Prajdic介绍给您
深入挖掘
您可以通过使用来模拟WireShark所做的工作,您将在中找到示例。让我为您解答。您可能希望重新表述您的问题,并且更具体一点。这里有一个与您的问题类似的SO问题,您可能会发现它很有用: