gpt4 book ai didi

c# - 需要一些异步调用的单例类

转载 作者:可可西里 更新时间:2023-11-01 08:17:02 25 4
gpt4 key购买 nike

我有一个单例类,它加载了一些关于它的构造的数据。问题是加载这些数据需要调用async方法,但是构造函数不能是async

换句话说,我的类(class)有以下结构:

public class Singleton
{
private static Singleton instance;

private Singleton()
{
LoadData();
}

public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}

LoadData() 是一个 async 函数,它调用许多 async 函数以及初始化。我怎样才能正确调用 LoadData() 以便一切都正确初始化?

最佳答案

线程安全的异步单例的解决方案实际上非常简单,如果我们只让 Task 的内部机制类(class)为我们工作!

那么,Task 是如何实现的?工作?假设您有一个 Task<T>实例还有你await它一次。现在任务已执行,值为 T生产并返回给您。如果你await怎么办?又是相同任务实例?在这种情况下,任务只是以完全同步的方式立即返回先前产生的值。

如果你await怎么办?来自多个线程的相同任务实例同时(您通常会在其中获得竞争条件)?好吧,第一个(因为那里第一个到达那里)将执行任务代码,而其他人将等待结果被处理。然后当结果产生时,所有await的将(几乎)同时完成并返回值。

所以 async 的解决方案线程安全的单例其实 super 简单:

public class Singleton
{
private static readonly Task<Singleton> _getInstanceTask = CreateSingleton();

public static Task<Singleton> Instance
{
get { return _getInstanceTask; }
}

private Singleton(SomeData someData)
{
SomeData = someData;
}

public SomeData SomeData { get; private set; }

private static async Task<Singleton> CreateSingleton()
{
SomeData someData = await LoadData();
return new Singleton(someData);
}
}

现在您可以通过这种方式访问​​单例:

Singleton mySingleton = await Singleton.Instance;

Singleton mySingleton = Singleton.Instance.Result;

SomeData mySingletonData = (await Singleton.Instance).SomeData;

SomeData mySingletonData = Singleton.Instance.Result.SomeData;

在这里阅读更多:Async singleton initialization

关于c# - 需要一些异步调用的单例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12534705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com