我正在尝试将图像源属性设置为从API以JSON返回的Uri。返回的JSON对象具有两个属性。
我创建了以下帮助器类以查询API并提取Uri属性:
public class GetPicUri
{
public GetPicUri()
{
}
private string _uri;
public async Task<string> Get()
{
var uri = new Uri("https://randompicture.api/random");
HttpClient getResponse = new HttpClient();
var json = await getResponse.GetStringAsync(uri);
var picture = JsonConvert.DeserializeObject<Picture>(json);
_uri = picture.Uri;
return _uri;
}
}
这是用于反序列化JSON的模型:
public class Picture
{
public Picture()
{
}
public string Description { get; set; }
public string Uri { get; set; }
}
问题是我无法访问GetPicUri类的字符串属性:
var picUri = new GetPicUri();
string imageSource = picUri.Get();
尝试此操作时,每次都会得到一个例外:
无法从“ System.Threading.Tasks.Task”转换为“字符串”
我尝试将其切成一堆不同的方式,例如将Uri作为静态字符串,并将Get方法作为async Task
(或void
)进行更新。静态字符串,并从构造函数中调用。我尝试将其作为属性的Get方法运行。但是我无法正常工作。
所以我想我有两个问题,第一个是我在这里具体做错了什么,从设计的角度来看,做这件事的正确方法是什么?
答案 0 :(得分:1)
如果实际上是异步的,请在方法名称上添加一个Aync
,例如:
public async Task<string> GetAsync()
{
var uri = new Uri("https://randompicture.api/random");
HttpClient getResponse = new HttpClient();
var json = await getResponse.GetStringAsync(uri);
var picture = JsonConvert.DeserializeObject<Picture>(json);
_uri = picture.Uri;
return _uri;
}
致电使用:
await picUri.GetAsync();
答案 1 :(得分:0)
您的get方法将返回Task(基本上,一个对象包含状态等任务信息),任何异步方法都应返回task(或void),您需要使用await关键字异步等待此任务完成< / p>
string imageSource = await picUri.Get();
使用上述方法,您还必须将调用方法也更改为async,并且您会发现async关键字扩展到您的代码中
或通过从get方法返回的任务对象获取Result属性来强制该方法同步运行(这基本上使将Get方法声明为async毫无用处)
string imageSource = picUri.Get().Result;