2013-08-22 2 views
1

Я написал небольшое консольное приложение, которое подключается к удаленному сайту, загружает некоторые данные и обрабатывает их. Поскольку это сетевая операция, поэтому я хочу, чтобы мое приложение было достаточно интеллектуальным, чтобы перейти в состояние паузы, когда нет подключения к Интернету. Если доступ к Интернету становится доступным, он должен возобновить свою работу.обнаружение подключения к Интернету/отключение в консольном приложении C#

Что я сделал до сих пор, если я запускаю приложение, он начинает загрузку данных с удаленного сайта. Если я отключу подключение к Интернету, он ведет себя правильно, отображая соответствующую информацию. Но, как только сетевое соединение вверх, оно возобновляется и загружает данные только для одной итерации цикла 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 выполняется только один раз ??

Спасибо.

+0

Visual Studio является редактором и не дает никакой информации о вашем коде, который применит. Вместо этого укажите версию .Net. – OmegaMan

+0

.NET Framework 4.5 – Azeem

+0

Я просто запускаю вашу программу и цикл while, о котором вы упоминали, запускается для указанной вами суммы ... – Zaki

ответ

2

Если NetworkChange_NetworkAvailabilityChanged стреляют каждый раз, когда NIC изменяет его статус нет необходимости в то время цикла, чтобы ждать соединения

Я также переместить 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(); 
    } 
} 
Смежные вопросы