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

标签 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();

当我尝试这个时,我每次都会遇到异常:

cannot convert from 'System.Threading.Tasks.Task' to 'string'

我试过用很多不同的方式来分割它,例如将 Uri 作为静态字符串,并将 Get 方法作为 async Task(或 void) 并让它只更新静态字符串,并从构造函数中调用。我试过将它作为属性的 Get 方法运行。但我无法让它工作。

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

最佳答案

如果方法实际上是异步的,则将 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();

关于c# - 这种异步/等待方法有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54509414/

相关文章:

c# - 我应该如何将返回非泛型任务的函数转换为 ValueTask?

c# - 在 ASP.NET Web 应用程序中将异步/等待与任务一起使用时,UI 线程被阻塞

c# - 动态字段 const 与任何旧的引用字段 const 行为

java - 这两个java.io.File线程安全问题是否被规避了?

c# - 为什么一个基本的单线程 C# 控制台应用程序需要 3 个线程?

c# - 这三个 Task Continuation 之间有什么区别?

C#如何设置声音字节的音量[]

C# - 是否可以创建一个可以从带有参数的命令行运行的 Windows 窗体应用程序?

c# - 尽管 State=Modified,为什么 EF Core 只生成父(游戏)属性更新?

python - 使用 ThreadPoolExecutor 时不会从多个线程中获得任何好处