C# でゲッターまたはセッターから非同期メソッドを呼び出す最もエレガントな方法は何でしょうか?
ここに、説明に役立つ疑似コードをいくつか示します。
async Task<IEnumerable> MyAsyncMethod()
{
return await DoSomethingAsync();
}
public IEnumerable MyList
{
get
{
//call MyAsyncMethod() here
}
}
ベストアンサー1
C# でプロパティが許可されない技術的な理由はありません。「非同期プロパティ」は矛盾語であるため、これは意図的な設計上の決定でした。async
プロパティは現在の値を返す必要があり、バックグラウンド操作を開始してはなりません。
通常、誰かが「非同期プロパティ」を必要とする場合、実際に必要なのは次のうちのいずれかです。
- 値を返す非同期メソッド。この場合、プロパティをメソッドに変更します
async
。 - データ バインディングで使用できるが、非同期で計算/取得する必要がある値。この場合、
async
包含オブジェクトのファクトリ メソッドを使用するか、async InitAsync()
メソッドを使用します。データ バインディングされた値は、値が計算/取得されるまで保持されますdefault(T)
。 - 作成コストが高いが、将来使用するためにキャッシュする必要がある値。この場合、
AsyncLazy
私のブログからまたはAsyncEx ライブラリこれによって、有効なプロパティが提供されますawait
。
更新:私がカバーする非同期プロパティ私の最近の「非同期 OOP」ブログ投稿の 1 つで。