0

我在我的 Windows Phone 8 应用程序中有这个方法,我从一个 url 获取一些数据

   public async static Task<byte[]> getData(string url)
    {
    HttpClient client = null;
    HttpResponseMessage response = null;
    Stream stream = null;
    byte[] dataBytes = null;
    bool error = false;

    try
    {
        Uri uri = new Uri(url);

        client = new HttpClient();
        response = await client.GetAsync(uri);
        response.EnsureSuccessStatusCode();

        stream = await response.Content.ReadAsStreamAsync();
        dataBytes = getDataBytes(stream); 

        if (dataBytes == null)
        {
            error = true;
        }
        else if (dataBytes.Length == 0)
        {
            error = true;
        }
    }
    catch (HttpRequestException )
    {
    }

    if (error)
    {
        return getData(url); // this is where the issue is
    }

    return dataBytes;
    }

但是由于该方法是异步方法,因此返回类型不能是任务,就像我在返回任务后所做的return getData(url);那样getData(string)。关于如何重写它以使其工作的任何想法?

4

2 回答 2

3

等待结果getData可能会奏效。尽管如此,我还是强烈建议您使用循环重写您的方法,而不是再次递归调用该方法。它使阅读变得困难,并可能导致无法预料的问题。

public async static Task<byte[]> getData(string url)
{
    bool success = false;

    byte[] dataBytes = null;

    while (!success)
    {               
        try
        {
            Uri uri = new Uri(url);

            var client = new HttpClient();
            var response = await client.GetAsync(uri);
            response.EnsureSuccessStatusCode();

            var stream = await response.Content.ReadAsStreamAsync();
            dataBytes = getDataBytes(stream); 

            success = dataBytes != null && dataBytes.Length > 0;
        }
        catch (HttpRequestException)
        {
        }
    }

    return dataBytes;
}
于 2013-10-07T10:08:12.237 回答
1

您可以通过将返回更改为以下内容来解决编译错误:

if (error)
{
return await getData(url); // this is where the issue is
}

我希望你意识到只要没有数据返回,这段代码就会一直循环吗?拥有许多这样的客户端很容易使您的服务器超载。

于 2013-10-07T10:02:13.673 回答