繁体   English   中英

如何返回任务 <T> 在异步方法中

[英]How to return a Task<T> in an async method

我在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;
    }

但是由于该方法是异步方法,所以返回类型不能是Task,就像我在行上所做的return getData(url); 因为getData(string)返回Task。 关于如何重写它以使其起作用的任何想法?

等待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;
}

您可以通过将return更改为以下内容来避免编译错误:

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

我希望您确实意识到只要没有数据返回,该代码就会继续循环? 有许多这样的客户端很容易使服务器过载。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM