このデータをロードするには、非同期メソッドを呼び出す必要がありますが、コンストラクタを非同期にすることはできません。
あなたは、コンストラクタ自体が非同期にすることはできませんが、はコンストラクタ内からの非同期メソッドを呼び出すことができます。すぐに結果を戻すことはできません。
Task
またはTask<T>
が返された場合は、非同期操作が完了した時点で常にタスクを継続してクラス内のデータを設定したり、結果をブロックすることができますあなたのシナリオこのオブジェクトの構築の要件を知らなければ、このシナリオで何が適切かを知ることは困難です。
編集:
一つの選択肢、上記の目標を与え、Instance
を取得するメソッドは、メソッド、プロパティではないになるように、あなたのSingleton
宣言を変更することです。これは、あなたがそれを非同期で行うことができます:
public class Singleton
{
private static Singleton instance;
private Singleton()
{
// Don't load the data here - will be called separately
}
public static async Task<Singleton> GetInstance()
{
if (instance == null)
{
instance = new Singleton();
await instance.LoadData();
}
return instance;
}
}
これは、あなたが実際にインスタンスを取得するための呼び出しにawait
を使用することができるようになります。これについての良い点は、非同期操作を呼び出すことが非常にはっきりしており、結果が他の非同期メソッドと同じように戻ってくるため、結果の適切な処理が得られることです。
しかし、これはスレッドセーフではありません(オリジナルはどちらでもありません)ので、複数のスレッドからこのシングルトンを使用する場合は、全体のデザインを再考する必要があります。
もう1つの方法は、Singleton
クラスが自動的にデータを読み込まないようにすることです。代わりに、非同期クラスからデータを取得するメソッドを作成します。これはいくつかの本当の利点を提供します。使い方はおそらくもう少し標準的です。複数のスレッドからの呼び出しを(データ読み込みプロセスを制御できるので)簡単にサポートすることができます。非同期クラスインスタンスへのアクセス。
。 –
コンストラクタからasyncメソッドを呼び出すこともできます。 – DarthVader
あなたは何をしたいのかについてより多くの文脈を与えてください。現時点ではやや不明です。 –