2014-10-08 102 views
0

检查网址/网站名称的简单代码是否有效。 此代码(同步代码)完美无缺。当我评论同步代码并取消注释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 2014-10-08 22:14:06

+0

@ Isantipov,我没有得到错误。但它写道“System.Threading.Tasks.Task'1 [System.String]”我没有得到预期的结果,也启用了异步代码。 – 2014-10-08 22:19:19

+0

@EricSmith这是在任务上调用'ToString'而不是实际结果的结果。看到我的答案。 – i3arnon 2014-10-08 22:26:32

回答

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'指向一个使用UI线程消息泵的上下文。 – Aron 2014-10-09 01:56:42