![](/img/trans.png)
[英]How do I make an async method return Task<IEnumerable<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.