Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步等待代码。为什么它不起作用?_C#_.net_Asynchronous_Async Await_C# 5.0 - Fatal编程技术网

C# 异步等待代码。为什么它不起作用?

C# 异步等待代码。为什么它不起作用?,c#,.net,asynchronous,async-await,c#-5.0,C#,.net,Asynchronous,Async Await,C# 5.0,检查URL/网站名称是否有效的简单代码。 此代码(同步代码)工作正常。当我注释sync代码并取消注释async代码时,代码工作不正常。我的async编程有什么问题 class Program { static StringBuilder urlStatus = new StringBuilder(""); //public static async Task<string> GetHeadersAsync(string url) //Async Code

检查URL/网站名称是否有效的简单代码。 此代码(同步代码)工作正常。当我注释sync代码并取消注释
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());
    }
}
类程序
{
静态StringBuilder urlStatus=新StringBuilder(“”);
//公共静态异步任务GetHeaderAsync(字符串url)//异步代码
公共静态字符串getHeaderAsync(字符串url)///同步代码
{
var request=(HttpWebRequest)WebRequest.Create(url);
request.Method=“HEAD”;
尝试
{
//使用(var response=await request.GetResponseAsync()作为HttpWebResponse)//异步代码
使用(var response=request.GetResponse()作为HttpWebResponse)///Sync代码
{
if(response!=null&&response.StatusCode==HttpStatusCode.OK)
返回“HTTP_OK”;
返回“错误”;
}
}
捕获(WebException ex)
{
返回例如ToString();
}
捕获(例外情况除外)
{
返回例如ToString();
}
}
静态void Main(字符串[]参数)
{
字符串行数据;
//URLList.txt的内容
//http://www.oracle.com
//http://www.oracletest.com
//http://www.cnn.com
//http://www.cnntest.com
使用(StreamReader sr=newstreamreader(“urlist.txt”))
{
而((lineData=sr.ReadLine())!=null)
{
var urlRetStatus=GetHeaderAsync(lineData);
urlStatus.Append(lineData+“”+urlRetStatus.ToString()+System.Environment.NewLine);
}
}
System.IO.File.WriteAllText(@“ErrorURL.txt”,urlStatus.ToString());
}
}

调用
async
方法时,返回一个表示异步操作的任务。要从该任务中提取实际结果,请使用
wait
关键字:

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

请记住,这将阻止调用线程,直到
async
操作完成,因此不建议这样做。

当调用
async
方法时,您将返回表示异步操作的任务。要从该任务中提取实际结果,请使用
wait
关键字:

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

请记住,这将阻止调用线程,直到
async
操作完成,因此不建议这样做。

您需要指定接收的错误,否则任何人都很难帮助您。我想这可能表明您不正确地使用了异步方法。@Isantipov,我没有收到错误消息。但是它写了“System.Threading.Tasks.Task`1[System.String]”在启用异步代码的情况下,我没有得到预期的结果。@这是对
任务调用
ToString
的结果,而不是实际结果。请看我的答案。您需要指定接收到的错误,否则任何人都很难帮助您。我想这可能表明您不正确地使用了异步方法。@Isantipov,我没有收到错误消息。但是它写了“System.Threading.Tasks.Task`1[System.String]”在启用异步代码的情况下,我没有得到预期的结果。@这是对
任务调用
ToString
的结果,而不是实际结果。请参阅我的答案。重要的是要强调,
Task.Result
在您阻塞UI线程时会造成死锁,while
SynchronizationContext.Current
指向使用UI线程消息泵的上下文。重要的是要强调,
Task.Result
在阻止UI线程时可能并将创建死锁,而
SynchronizationContext.Current
指向使用UI线程消息泵的上下文。