Task< string>返回意想不到的结果

本文关键字:意想不到 结果 返回 string Task | 更新日期: 2023-09-27 18:01:49

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

除了这个函数返回"System. threading . tasks . task " 1[System. threading . tasks . task]。我在谷歌上搜索了一个解决方案,我找到了微软的解决方案,他们不知道如何做出好的解释或直接的解决方案,所以这是一个骗局。

下面是我的代码打印出的值

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()扩展方法似乎不起作用:/Regards, TuukkaX.

Task< string>返回意想不到的结果

您需要在async上使用await方法来将任务打开到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);

这是一个async函数,所以它返回一个Task<string>。您应该await它,或等待Task完成。

我要做的是,在调用方法的行末尾添加。result:

string source = GetWebSourceAsync(new Uri("http://checkip.dyndns.org/")).Result;

'Result'取T out中的任何类型。在您的例子中,它使Task<string>变成了string