小编Tre*_*ert的帖子

仅初始化一次异步模式

假设我有一个类,其成员需要异步操作来初始化(例如文件i/o或web请求).我只需要初始化一次,我不想重新初始化.

任务和异步 - 是否适合完成此任务?

这是我目前正在做的一个例子:

private Task _initializeTask;
public Task InitializeAsync()
{
    return _initializeTask ?? (_initializeTask = Task.Run(
            async () =>
            {
                // Do an action requiring await here
                await _storageField.LoadAsync();
            }));
}
Run Code Online (Sandbox Code Playgroud)

这是否符合我的想法?有更好的方法吗?

它是线程安全的吗?不是要求,但应予以考虑.

编辑:

我认为它做什么?我相信如果没有分配_initializeTask,那么它将被分配一个新任务,该任务将启动,然后等待其中包含的异步lambda.对该方法的任何后续调用都将等待已分配给_initializedTask的已运行(或已完成)任务.

我什么时候想要它呢?通常我会在使用IoC容器解析的服务上使用这种方法.可以使用对类的引用来构造多个依赖类.然后,在使用之前,每个都等待InitializeAsync().如果有多个依赖类,那么我不想在初始化时加倍.

工厂方法?通常不会构造需要初始化的多个实例,因此Factory方法似乎不是一个好的解决方案.我已经在文件夹包装类之类的东西中使用了类似"静态CreateAsync()"的方法,但这并没有让我将初始化文件夹注入构造函数中.当Async Factory方法不能与IoC构造函数注入一起使用时,它们不会获得任何东西.

c# asynchronous task task-parallel-library async-await

3
推荐指数
1
解决办法
2424
查看次数