C# 检测互联网空闲时间

C# 检测互联网空闲时间,c#,idle-processing,C#,Idle Processing,如何使用C#检测internet空闲时(无下载/上载),并在空闲时启动下载?如果您正在等待没有连接的时刻。。。你必须知道,即使你认为自己没有使用互联网,也有很多联系 试着看一看和(从SysitGenerals)有一个想法 非工作交通 注意:如果您通过Mono在Mac或Linux上使用.NET,您应该知道此API无法很好地移植到其他操作系统。所以,我在这里描述的只是Windows 如果你想了解交通状况,你可以尝试使用 您可以这样做,如下所示: var properties = IPGlobalP

如何使用C#检测internet空闲时(无下载/上载),并在空闲时启动下载?

如果您正在等待没有连接的时刻。。。你必须知道,即使你认为自己没有使用互联网,也有很多联系

试着看一看和(从SysitGenerals)有一个想法


非工作交通 注意:如果您通过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();

警告语

  • 记住取消订阅事件处理程序
  • 这仅适用于Windows
  • 请记住,第一次运行的
    是Internetile
    (如上所述),所有网络适配器都是新的。在声明使用它们之前,您可能需要先调用
    GetInternetIdleTime
    (如上所述)
  • 方法
    IsInternetIdle
    GetInternetIdleTime
    仅在Internet可用时使用。您可以添加检查以查看各个网络适配器是否已启动
  • 上面描述的
    GetInternetIdleTime
    的结果不是连接处于非活动状态的总时间,而是自发现连接处于非活动状态以来的时间。您可能需要在计时器中调用
    GetInternetIdleTime
    (当然,如果您的应用程序有一个主循环,比如说,它是一个游戏,您可以使用给定的频率调用它)
  • 如果网络适配器处于活动状态,并不意味着它正在使用Internet。也许它连接到某个内部网。无法判断“互联网”是否可以访问。您应该自己检查与各个服务器的连接。不知道该检查什么?这可能是有问题的,因为DNS可能在本地被过度占用。。。但你可以试试,甚至可以

  • 可供替代的 因为这是针对Windows的,所以您可以尝试使用网络适配器信息,我将通过Mladen Prajdic介绍给您


    深入挖掘
    您可以通过使用来模拟WireShark所做的工作,您将在中找到示例。让我为您解答。

    您可能希望重新表述您的问题,并且更具体一点。这里有一个与您的问题类似的SO问题,您可能会发现它很有用: