我有一个获取网站客户端源代码的函数,但遗憾的是它不是 async 函数:/所以,我创建了一个 async 该函数的版本,并且它返回了意外的结果。这是安全且有效的
public static string GetWebSource(Uri url)
{
WebClient client = new WebClient();
Stream stream = client.OpenRead(url);
StreamReader reader = new StreamReader(stream);
string source = reader.ReadToEnd();
stream.Close();
reader.Close();
return source;
}
它会按预期返回源代码,很酷,很棒,除非它不是 async 所以它会弄乱UI。这是 async 版本
public async static Task<string> GetWebSourceAsync(Uri url)
{
WebClient client = new WebClient();
Stream stream = await client.OpenReadTaskAsync(url);
StreamReader reader = new StreamReader(stream);
string source = await reader.ReadToEndAsync();
stream.Close();
reader.Close();
return source;
}
除了此函数返回&#34; System.Threading.Tasks.Task`1 [System.String]&#34;我搜索了一个解决方案,我找到了微软的解决方案,他们不知道如何做出正确的解释或直接的解决方案,这是一个欺诈行为。
这是我打印输出值的代码
string source = GetWebSourceAsync(new Uri("http://checkip.dyndns.org/")).ToString();
source = source.Replace("<html><head><title>Current IP Check</title></head><body>Current IP Address: ", "").Replace("</body></html>", "");
Console.Write(source);
那么如何让它显示字符串呢? .ToString()扩展方法似乎不起作用:/问候,TuukkaX。
答案 0 :(得分:3)
您需要在await
方法上使用async
将任务解包到T
(在您的情况下为字符串)。否则,您只需返回Task<string>
。
string source = await GetWebSourceAsync(new Uri("http://checkip.dyndns.org/"));
source = source.Replace("<html><head><title>Current IP Check</title></head><body>Current IP Address: ", "").Replace("</body></html>", "");
Console.Write(source);
答案 1 :(得分:1)
这是一个异步函数,因此返回Task<string>
。您应await
,或等待Task
完成。
答案 2 :(得分:0)
我会做什么,在调用方法的行尾添加.Result:
string source = GetWebSourceAsync(new Uri("http://checkip.dyndns.org/")).Result;
&#39;结果&#39;采取T out中的任何类型。在您的情况下,它会将Task<string>
变为string
。