当一个类的单个实例正在等待任务时会发生什么?

时间:2017-04-26 19:54:11

标签: c# multithreading asynchronous .net-core

编辑:更改"单身" 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()。会发生什么?

  • 是否由thread1锁定了DataAccess的实例,因此thread2无法在thread1完成之前开始执行GetUsers方法?
  • DataAccess的实例是否可用,而thread2运行相同的collection.Find方法,而thread1也在运行它?
  • DataAccess的实例是否可用,但是当thread2运行到已经运行的ToListAsync方法时,它会进入休眠状态?

1 个答案:

答案 0 :(得分:1)

选项2:单例可用和thread2运行相同的collection.Find方法,而thread1也运行它。

这就是为什么当你写一个单身人士时,你必须确保代码可以安全地同时运行或在一个重要的时间运行。通常这需要在资源周围放置lock,将其从选项2转到选项1。