【问题标题】:detect Internet Connection/Disconnection in Console App C#在控制台应用程序 C# 中检测 Internet 连接/断开连接
【发布时间】:2013-08-23 02:07:14
【问题描述】:

我编写了一个小型控制台应用程序,它与远程站点连接,下载一些数据并进行处理。因为它是网络操作,所以我希望我的应用程序足够智能,以便在没有互联网连接时进入暂停状态。如果互联网连接可用,它应该会恢复工作。

到目前为止,我所做的是,如果我运行应用程序,它就会开始从远程站点下载数据。如果我断开互联网连接,它会通过显示适当的信息来正确运行。但是一旦网络连接起来,它就会恢复并且只下载一次 while 循环的数据。

代码如下:

class Program
{
    static bool networkIsAvailable = false;
    static StreamWriter writer = null;
    static int i = 1;
    static string URI = "http://xxxxxxxxxxxxxxxxxxxxxxxxxxx/" + i + "/";

    static void Main(string[] args)
    {
        writer = new StreamWriter("c:\\StudentsList.txt", true);

        NetworkChange.NetworkAvailabilityChanged += new NetworkAvailabilityChangedEventHandler(NetworkChange_NetworkAvailabilityChanged);
        NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
        foreach (NetworkInterface nic in nics)
        {
            if (
                (nic.NetworkInterfaceType != NetworkInterfaceType.Loopback && nic.NetworkInterfaceType != NetworkInterfaceType.Tunnel) &&
                nic.OperationalStatus == OperationalStatus.Up)
            {
                networkIsAvailable = true;
            }
        }

        if (!networkIsAvailable)
            Console.WriteLine("Internet connection not available! We resume as soon as network is available...");
        else
            ConnectToPUServer();
    }

    public static void ConnectToPUServer()
    {
        var client = new WebClient();
        while (i < 500 && networkIsAvailable)
        {
            string html = client.DownloadString(URI);
            //some data processing
            Console.WriteLine(i);
            i++;
            URI = "http://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/" + i + "/";
        }
    }

    static void NetworkChange_NetworkAvailabilityChanged(object sender, NetworkAvailabilityEventArgs e)
    {
        networkIsAvailable = e.IsAvailable;
        if (!networkIsAvailable)
            Console.WriteLine("Internet connection not available! We resume as soon as network is available...");
        while (!networkIsAvailable)
        { 
            //waiting for internet connection
        }
        ConnectToPUServer();
        Console.WriteLine("Complete.");
        writer.Close();
    }
}

恢复后为什么ConnectToPUServer的while循环只执行了一次??

谢谢。

【问题讨论】:

  • Visual Studio 是一个编辑器,不提供有关您的代码的适用信息。请说明 .Net 的版本。
  • 我刚刚运行了你的程序,你提到的 while 循环运行了你指定的数量......
  • @Sam,您在 while 循环完成之前断开了互联网连接吗?
  • @MauricioGracia 啊没有...但另一方面,当然,如果您断开互联网连接,while 循环不会停止,因为在该特定循环内未检查互联网连接..
  • @Sam 所以我猜你没有注意到当 NIC 连接丢失时 networkIsAvailable 变量是如何变化的?

标签: c# .net console-application .net-4.5


【解决方案1】:

如果每次 NIC 更改其状态时都会触发 NetworkChange_NetworkAvailabilityChanged,则无需 while 循环等待连接

我还移动了 writer.close 和方法的结尾 ConnectToPUServer

public static void ConnectToPUServer()
{
    var client = new WebClient();
    while (i < 500 && networkIsAvailable)
    {
        string html = client.DownloadString(URI);
        //some data processing
        Console.WriteLine(i);
        i++;
        URI = "http://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/" + i + "/";
    }
    Console.WriteLine("Complete.");
    writer.Close();

}

static void NetworkChange_NetworkAvailabilityChanged(object sender, NetworkAvailabilityEventArgs e)
{
    networkIsAvailable = e.IsAvailable;
    if (!networkIsAvailable)
    {
        Console.WriteLine("Internet connection not available! We resume as soon as network is available...");
    }
    else
    {
        ConnectToPUServer();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    相关资源
    最近更新 更多