我正在重写一个必须调用数据库服务器的Windows 窗体应用程序。该调用最多可能需要 30 秒,因此我想缓存结果(它不会改变)。
多个事件如何触发对此信息的需求,具体取决于在 UI 中输入或选择的其他信息。可能需要该信息的不同 UI 组件彼此不知道。
我只想进行一次数据库调用。因此,如果您(用户)触发 30 秒的数据库调用(异步完成),然后 5 秒后应用程序的另一部分发现需要该信息,我不希望应用程序触发另一个数据库请求,只是因为缓存仍然是空的。我希望它等待剩余的 25 秒,直到信息可用,获取缓存的值,然后返回。
但我不太清楚如何在数据和代码方面构建它。
我将这种情况视为两个(或更多)请求,它们以某种方式排队,一旦数据库调用满足第一个请求,第二个请求就会获取现在缓存的结果值并返回。如果稍后其他东西(第三个东西)需要此信息,则请求将获取缓存的值并立即返回。
我想知道 .NET 中是否有内置模式或数据结构集来执行此操作。我觉得这几乎是——但不完全是——一种基本async/await
模式,只不过有多个事情正在等待相同的结果。
我正在考虑但无法想象的这种模式/架构是什么?
多个事物等待相同结果的模式只是……多个事物等待相同的任务。就是这样。没有魔法。
.NET
Task
可以等待多次,不会出现任何问题,并无限期地存储其结果(这与 .NET 不同ValueTask
,后者只能等待一次)。如果您等待一个已经完成的任务,它会立即返回其结果。因此,您可以只缓存任务,而不是缓存结果。考虑到这一点,只需保留对任务本身的引用即可。
第一次调用该方法时,查询将被触发并存储任务。后续调用仅返回相同的任务,因此每个人都会等待它,并且查询实际上只执行一次。
现在,这有点天真,因为它不处理任何错误。但这应该足以让您开始。