如何使用 async/await 进行独立的延迟初始化

问题描述 投票:0回答:1

我正在尝试使用依赖注入异步初始化一个类。我看过这篇文章https://blog.stephencleary.com/2013/01/async-oop-2-constructors.html 但我试图在第一次调用方法时初始化该类。

我有一个像下面这样的类,但我正在使用 DoWork 方法中的如何启动任务(注意我对等待/异步非常陌生)。

public class TestClass: ITestClass
{
    private readonly ILogger<TestClass> logger;
    private readonly Task initializeTask;
    private IDependencyClass depenencyClass;

    public TestClass(
        ILogger<ReportOnBehalfOfRequestPublisher> logger,
        IDependencyClass dependencyClass)
    {
        this.logger = logger;
        this.dependencyClass = dependencyClass;
        initializeTask = new Task(() => InitializeAsync());
    }

    private async Task InitializeAsync()
    {
        ... init this class
    }

    public async Task DoWork(IMessage message)
    {
        await this.initializeTask; // make sure we are initialized

        this.depenencyClass.DoSomething()
    }
}

问题在于,使用上面的代码,

initializeTask
处于创建状态。我可以只调用
initializeTask.Start()
并等待任务,但是有没有办法使用 async/await 来完成这个简单的独立延迟初始化?

async-await dependency-injection constructor c#-8.0
1个回答
0
投票

有没有办法使用 async/await 来完成这个简单的独立延迟初始化?

我认为有。诀窍是在第一次调用时包装延迟执行任务,从而使用

Lazy<T>
:

public class TestClass : ITestClass
{
    private readonly Lazy<Task> initializeTask;

    public TestClass(...)
    {
        ...
        this.initializeTask = new Lazy<Task>(this.InitializeAsync);
    }

    private async Task InitializeAsync()
    {
        ... init this class
    }

    public async Task DoWork(IMessage message)
    {
        await this.initializeTask.Value; // make sure we are initialized

        this.depenencyClass.DoSomething()
    }
}

这确保了

InitializeAsync
只被调用一次。它的
Task
将在
TestClass
的生命周期内被缓存,并且下次等待
Task
时,代码将立即继续,因为
Task
已经处于已完成状态。

© www.soinside.com 2019 - 2024. All rights reserved.