这种异步/等待方法有什么问题?

时间:2019-02-04 02:11:53

标签: c# multithreading task

我正在尝试将图像源属性设置为从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方法运行。但是我无法正常工作。

所以我想我有两个问题,第一个是我在这里具体做错了什么,从设计的角度来看,做这件事的正确方法是什么?

2 个答案:

答案 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;