2017-04-26 3 views
-1

編集:「シングルトン」が実際のシングルトンではないため「シングルインスタンス」に変更されました。クラスの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はスリープ状態になりますか?
+5

申し訳ありませんが、シングルトンはどこですか?あなたのコードから、DataAccessのコンストラクタを何度でも呼び出すことができます。 – taquion

+0

今すぐ更新します。 DataAccessはコントローラによって呼び出されるシングルトンです。 – Micteu

+0

指定された型がドキュメント内で、複数のスレッドから並列に呼び出されるように設計されていて、そうした場合の動作は、複数のスレッドから呼び出されるようには設計されておらず、あなたがそうした場合、予期せず間違っています。 – Servy

答えて

1

オプション2:シングルトンが利用可能で、thread2が同じコレクションを実行します。スレッド1も実行中です。

シングルトンを書くときには、コードを並行して実行することも、レンタルすることもできます。通常これでは、リソースの周りにlockを入れて、オプション2からオプション1にする必要があります。

+0

私の言葉が少しずれているので、私を愚かに感じさせようとするのではなく、私の好奇心を満たすことに感謝します。 – Micteu

関連する問題