編集:「シングルトン」が実際のシングルトンではないため「シングルインスタンス」に変更されました。クラスの1つのインスタンスがタスクを待っているときはどうなりますか?
DataAccess
クラスがアプリケーションで1つのインスタンスとして実行されているとします。これは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
私のスタートアップクラスのConfigureServicesメソッドで「シングルトン」として追加されます。
services.AddSingleton<DataAccess, DataAccess>();
そして、それがコントローラに注入されます。
スレッド1がDataAccess.GetUsers()を呼び出していて、その結果がToListAsyncメソッドの結果を待っているとします。スレッド1が待機している間、thread2はDataAccess.GetUsers()を呼び出します。何が起こるのですか?
- DataAccessのインスタンスがthread1によってロックされるため、thread1が終了するまで、thread2はGetUsersメソッドの実行を開始できませんか?
- DataAccessのインスタンスが使用可能で、thread2が同じcollection.Findメソッドを実行していますが、thread1も実行していますか?
- DataAccessのインスタンスは使用可能ですが、既に実行されているToListAsyncメソッドを実行すると、thread2はスリープ状態になりますか?
申し訳ありませんが、シングルトンはどこですか?あなたのコードから、DataAccessのコンストラクタを何度でも呼び出すことができます。 – taquion
今すぐ更新します。 DataAccessはコントローラによって呼び出されるシングルトンです。 – Micteu
指定された型がドキュメント内で、複数のスレッドから並列に呼び出されるように設計されていて、そうした場合の動作は、複数のスレッドから呼び出されるようには設計されておらず、あなたがそうした場合、予期せず間違っています。 – Servy