我正在尝试使用依赖注入异步初始化一个类。我看过这篇文章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 来完成这个简单的独立延迟初始化?
我认为有。诀窍是在第一次调用时包装延迟执行任务,从而使用
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
已经处于已完成状态。