任务<string>返回意外结果

时间:2015-07-09 18:18:31

标签: c# async-await

我有一个获取网站客户端源代码的函数,但遗憾的是它不是 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。

3 个答案:

答案 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