【问题标题】:Async Await code. Why it is not working?异步等待代码。为什么它不工作?
【发布时间】:2014-12-03 17:21:41
【问题描述】:

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

【问题讨论】:

  • 您需要指定您收到的是哪个错误,否则任何人都很难帮助您。我想这表明您错误地使用了异步方法。
  • @ Isantipov,我没有收到错误消息。但它写“System.Threading.Tasks.Task`1 [System.String]”我也没有得到预期的结果,也启用了异步代码。
  • @EricSmith 这是在Task&lt;string&gt; 上调用ToString 的结果,而不是实际结果。看我的回答。

标签: c# .net asynchronous async-await c#-5.0


【解决方案1】:

当您调用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 操作完成,因此不建议这样做。

【讨论】:

  • 强调Task.Result 可以并且将在您阻塞 UI 线程时创建死锁很重要,而SynchronizationContext.Current 指向使用 UI 线程的消息泵的上下文。
猜你喜欢
  • 2019-12-18
  • 2021-12-30
  • 2019-10-10
  • 2013-05-14
  • 2015-05-06
  • 2019-01-13
  • 1970-01-01
  • 1970-01-01
  • 2023-01-23
相关资源
最近更新 更多