1

リモート サイトに接続し、データをダウンロードして処理する小さなコンソール アプリを作成しました。ネットワーク操作であるため、インターネットに接続していないときにアプリケーションを一時停止状態にするのに十分なほどインテリジェントにする必要があります。インターネット接続が利用可能になると、作業が再開されます。

これまでに行ったことは、アプリケーションを実行すると、リモート サイトからデータのダウンロードが開始されることです。インターネット接続を切断すると、適切な情報が表示されて正しく動作します。ただし、ネットワーク接続が確立されるとすぐに再開し、while ループの 1 回の繰り返しのデータのみをダウンロードします。

コードは次のとおりです。

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();
    }
}

再開後、while ループがConnectToPUServer1 回だけ実行されるのはなぜですか??

ありがとう。

4

1 に答える 1

2

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();
    }
}
于 2013-08-22T16:23:48.097 に答える