编辑:更改"单身" to"单个实例"因为它不是一个真正的单身人士。
假设您在应用程序中将DataAccess
类作为单个实例运行。这个使用MongoDB,但它可以应用于任何有内部异步调用的东西。
public class DataAccess
{
private IMongoDatabase _database;
public DataAccess(IMongoClient client)
{
_database = client.GetDatabase("myDataBase");
}
public virtual async Task<IEnumerable<User>> GetUsers()
{
var collection = _database.GetCollection<User>("users").Find("{}");
return await collection.ToListAsync();
}
}
DataAccess
被添加为&#34;单身&#34;在我的Startup类的ConfigureServices方法中:
services.AddSingleton<DataAccess, DataAccess>();
然后将它注入控制器。
假设我有thread1调用DataAccess.GetUsers(),并且等待ToListAsync方法的结果。现在thread2在thread1等待时调用DataAccess.GetUsers()。会发生什么?
答案 0 :(得分:1)
选项2:单例可用和thread2运行相同的collection.Find方法,而thread1也运行它。
这就是为什么当你写一个单身人士时,你必须确保代码可以安全地同时运行或在一个重要的时间运行。通常这需要在资源周围放置lock
,将其从选项2转到选项1。