2014-09-16 3 views
0

Поэтому я хотел бы проверить подключение к Интернету в портативной библиотеке классов.Как проверить подключение к Интернету в портативной библиотеке классов

До сих пор я использовал этот метод GetResponse() in C#

Но это не возвращает логическое значение, чтобы сказать мне, если у меня есть связь или нет.

Пока мой код выглядит следующим образом:

public static bool CheckForInternetConnection() 
    { 
     try 
     { 
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.google.com"); 
      request.UseDefaultCredentials = true; 
      request.BeginGetResponse(new AsyncCallback(FinishRequest), request); 
     } 
     catch 
     { 
      return false; 
     } 
    } 

    private static bool FinishRequest(IAsyncResult result) 
    { 
     HttpWebResponse response = (result.AsyncState as HttpWebRequest).EndGetResponse(result) as HttpWebResponse; 
     if (response.StatusCode == HttpStatusCode.OK) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 

, но я получаю ошибку на линии с new AsyncCallback() говоря FinishRequest имеет неправильный тип возвращаемого .. Как я могу это сделать?

Пожалуйста, имейте в виду, что это в портативном библиотеки классов, поэтому метод GetResponse() не существует

+0

'AsyncCallback' возвращает пустоту, так 'FinishRequest' должен сделать то же самое. Вы можете создать класс-оболочку, содержащий «HttpWebRequest» и логическое значение, и передать это в «BeginGetResponse». Затем логическое значение можно установить в «FinishRequest», если это необходимо, и ссылаться на «CheckForInternetConnection». Однако я не знаю, является ли это самым элегантным решением. –

+0

Причина, по которой я избегал этого решения, заключается в том, что я не хочу, чтобы 'CheckForInternetConnection()' возвращал значение этой переменной до того, как был выполнен AsyncCallback. Например. давая мне неправильное значение – user1

+0

Вы можете посмотреть [Task.FromAsync] (http://msdn.microsoft.com/en-us/library/dd321448 (v = vs.110) .aspx), который позволит вам подождать в результате чего ничего не будет продолжаться до тех пор, пока вызов не будет завершен. –

ответ

2

Вы можете использовать manualresetevent так:

private static ManualResetEvent evt = new ManualResetEvent(false); 

public static bool CheckForInternetConnection() 
{ 
    try 
    { 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.google.com"); 
    request.UseDefaultCredentials = true; 
    request.BeginGetResponse(new AsyncCallback(FinishRequest), request); 
    evt.WaitOne(); 
    return request.HaveResponse; 
    } 
    catch 
    { 
    return false; 
    } 
} 

private static void FinishRequest(IAsyncResult result) 
{ 
    HttpWebResponse response = (result.AsyncState as HttpWebRequest).EndGetResponse(result) as HttpWebResponse; 
    evt.Set(); 
}