【问题标题】:How to asynchronously initialize resource如何异步初始化资源
【发布时间】:2018-05-21 19:10:52
【问题描述】:

我有Task<ISomething>,应该在所有客户端线程之间共享。我还有 Worker 类,每个请求创建一次 - services.AddScoped<Worker>()。

在我的异步代码中初始化 ISomething 而无需多次构造它的正确方法是什么?

如果资源正在构建中(调用 web 服务),其他请求应该异步等待,直到它完成然后继续。锁定也不是AFAIK的选项。 AsyncLazy 是个好主意吗?

【问题讨论】:

    标签: c# asp.net asynchronous asp.net-core async-await


    【解决方案1】:

    您可以根据需要多次等待任务。

    在这种特殊情况下,由于大部分时间任务都会完成,ValueTask<T> 会是更好的选择。

    我没有提到创建ISomething 的细节,但您可以在大多数 DI 容器中注入ValueTask<T>。

    【讨论】:

    • 如果我需要Dictionary<string, Task<ISomething>>怎么办?如果我使用并发字典,则有可能,该任务将在一个线程上加载并在另一个线程上等待,因此可能会发生不好的事情。
    • 在 ASP.NET 中会发生哪些不会发生的坏事?
    • 例如构建 ISomething 将需要 DbContext,因为其他线程已结束并且所有依赖项都已释放,因此该 DbContext 已被释放。
    • 很抱歉,但在我看来你完全迷路了。尝试发布代码,看看我们是否可以提供更多帮助。
    猜你喜欢
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 2022-06-13
    • 2021-07-21
    • 1970-01-01
    • 2023-03-08
    • 2023-03-27
    • 2018-06-26
    相关资源
    最近更新 更多