2014-10-08 2 views
0

Простой код для проверки URL/имени веб-сайта действителен или нет. Этот код (код синхронизации) работает идеально. Когда я комментирую код синхронизации и раскомментирую код async, код не работает нормально. Что случилось в моем программировании async?Асинхронный код ожидания. Почему он не работает?

class Program 
{ 
    static StringBuilder urlStatus = new StringBuilder(""); 
    //public static async Task<string> GetHeadersAsync(string url)  //Async Code 
    public static string GetHeadersAsync(string url) ////Sync Code 
    { 
     var request = (HttpWebRequest)WebRequest.Create(url); 
     request.Method = "HEAD"; 
     try 
     { 
      //using (var response = await request.GetResponseAsync() as HttpWebResponse) //Async Code 
      using (var response = request.GetResponse() as HttpWebResponse)  ////Sync Code 
      { 
       if (response != null && response.StatusCode == HttpStatusCode.OK) 
        return "HTTP_OK"; 
       return "Error"; 
      } 
     } 
     catch (WebException ex) 
     { 
      return ex.ToString(); 
     } 
     catch (Exception ex) 
     { 
      return ex.ToString(); 
     } 
    } 
    static void Main(string[] args) 
    { 
     string lineData; 
     //content of URLList.txt 
     //http://www.oracle.com 
     //http://www.oracletest.com 
     //http://www.cnn.com 
     //http://www.cnntest.com 
     using (StreamReader sr = new StreamReader("URLList.txt")) 
     { 
      while ((lineData = sr.ReadLine()) != null) 
      { 
       var urlRetStatus = GetHeadersAsync(lineData); 
       urlStatus.Append(lineData + " " + urlRetStatus.ToString() + System.Environment.NewLine); 
      } 
     } 
     System.IO.File.WriteAllText(@"ErrorURL.txt", urlStatus.ToString()); 
    } 
} 
+1

вам нужно указать, какую ошибку вы принимаете, иначе трудно кому-либо помочь вам. Я предполагаю, что это будет означать, что вы используете асинхронный метод неправильно. – Isantipov

+0

@ Исантипов, я не ошибаюсь. Но он пишет «System.Threading.Tasks.Task'1 [System.String]« Я не получаю ожидаемые результаты и с включенным кодом Async. –

+0

@EricSmith Это результат вызова 'ToString' в' Задача ' вместо фактического результата. См. Мой ответ. – i3arnon

ответ

4

При вызове метода async вы получите обратно задачу, которая представляет собой асинхронную операцию. Чтобы извлечь фактический результат из этой задачи вы используете ключевое слово await:

Task<string> task = GetHeadersAsync(lineData); 
string result = await task; 

В вашем случае вы звоните, что метод из Main, который не может быть async метод и не может использовать await так что вам нужно использовать Task.Result свойство:

Task<string> task = GetHeadersAsync(lineData); 
string result = task.Result; 

Имейте в виду, что это будет блокировать вызывающий поток, пока async операции не завершено, поэтому не рекомендуется.

+1

Важно, чтобы «НАСТРЕВИТЬ», что «Task.Result» может И БУДЕТ создать тупик, когда вы блокируете поток UI, в то время как «SynchronizationContext.Current» указывает на контекст, который использует насос сообщений потока пользовательского интерфейса. – Aron

Смежные вопросы