C# 在C中异步加载属性的最佳方法是什么

C# 在C中异步加载属性的最佳方法是什么,c#,.net-core,async-await,C#,.net Core,Async Await,我正在使用c.NETCore5BlazerWebService 我有一个服务,它有一个属性列表 public class Service : IService { public HashSet<Thing> Things {get; set;} } 现在我想从磁盘加载这些东西,所以我将它们私密地缓存在服务中 public class Service : IService { private HashSet<Thing> _things publi

我正在使用c.NETCore5BlazerWebService

我有一个服务,它有一个属性列表

public class Service : IService
{
    public HashSet<Thing> Things {get; set;}
}
现在我想从磁盘加载这些东西,所以我将它们私密地缓存在服务中

public class Service : IService
{
    private HashSet<Thing> _things
    public HashSet<Thing> Things => _things : LoadThings();
}
但是LoadThings访问磁盘,所以我希望IO异步运行并等待它。但是现在LoadThings需要异步,我不能这样做:

public class Service : IService
{
    private HashSet<Thing> _things
    public HashSet<Thing> Things => _things : await LoadThings();
}
我明白为什么;异步链丢失


所以我的问题是:如果东西为空,那么等待异步IO的最佳方式是什么?

当你说缓存时,我假设你指的是只加载并重新使用的东西,而不是过期的缓存。这似乎与您现有的代码相匹配

在这种情况下,您可以这样做:

公共课服务:IService { 私事; 公共服务 { _事物=新的懒散的事物; } 需要思考的公共异步任务方法 { var things=等待_things.Value; //现在你有东西可以用了。 } 私有异步任务LoadThings { //此方法异步加载您的内容。 } }
这些东西在您第一次需要时异步加载,然后在后续调用中可用。

没有异步属性。将属性替换为返回缓存数据或检索新数据的方法如果要延迟初始化数据,而不是实际缓存过期数据,可以检查但LoadThings会访问磁盘,因此我希望IO根据您在LoadThings中的操作异步运行,请记住,这可能不是前进的方向,但仍可能同步运行;只是一个想法。有点关联:我觉得在构造函数中做这样复杂的事情通常是个坏主意。我觉得这很好,但这里发生的是IO抛出错误?@Tod构造函数中没有发生复杂的事情。LoadThings是在首次访问_things.Value时延迟计算的,因此在调用MethodThanedsThings时会抛出任何异常。