15

重複の可能性:
ゲッターまたはセッターから非同期メソッドを呼び出す方法は?

内部で Sqlite await を使用するプロパティを実装しようとしています:

public int ID {
        get
        {
            if (_id != null)
            {
                return _id;
            }
            if (string.IsNullOrEmpty(ImageName))
            {
                return -1;
            }
            var query = CurrentConnection.Table<Image>().Where(i => i.ImageName == ImageName);
            var result = await query.ToListAsync();
            ...other code

ただし、プロパティがawaitに設定されていないため(試してみましたが機能しません)、プロパティ内でawaitを使用できません。

プロパティの代わりにメソッドを使用する以外に、これを回避する方法はありますか?

4

4 に答える 4

12

いいえ-非同期プロパティのようなものはありません。非同期プロパティを宣言できたとしても、戻り値が...Task<int>ではなくとして宣言する必要がありintます。そうでない場合、式にヒットしたときに何を返したいawaitですか?

非同期動作が確実に必要であると仮定して、ここで方法を強くお勧めします。GetIdAsync

于 2012-12-05T15:30:21.747 に答える
11

C# でプロパティが許可されないという技術的な理由はありません。async「非同期プロパティ」は矛盾しているため、意図的な設計上の決定でした。

プロパティは現在の値を返す必要があります。バックグラウンド操作を開始するべきではありません。

通常、「非同期プロパティ」が必要な場合、実際に必要なのは次のいずれかです。

  1. 値を返す非同期メソッド。この場合、プロパティをasyncメソッドに変更します。
  2. データバインディングで使用できる値ですが、非同期で計算/取得する必要があります。この場合、async含まれているオブジェクトのファクトリ メソッドを使用するか、メソッドを使用しasync InitAsync()ます。データバインドさdefault(T)れた値は、値が計算/取得されるまで続きます。
  3. 作成にはコストがかかりますが、将来の使用のためにキャッシュする必要がある値。この場合、AsyncLazy 私のブログまたはAsyncEx ライブラリから使用します。これにより、await有能なプロパティが得られます。
于 2012-12-05T15:40:54.473 に答える
4

とにかく変数値を返す以外の目的でプロパティGetterを使用しないでください。

コードを呼び出すと、クラスを呼び出すときに何を期待するかについて、パフォーマンスの観点から想定されることがよくあります。

経験則:

  • プロパティは、値の非常に高速な戻りを意味します
  • メソッドは多かれ少なかれ長い操作を意味します

したがって、長いロジックをゲッターに入れないことを強くお勧めします。代わりにメソッドを使用してください。

MicrosoftのRicoMarianyは、ここでそれに関する非常に詳細な記事を提供しています:プロパティのパフォーマンスガイドライン

于 2012-12-05T15:35:29.270 に答える
0

await を使用すると、メソッドの残りの部分がコールバックになります。つまり、int を返すことはできません。Task<int> を返す必要があります。現在、プロパティで await を使用することもサポートされていません。プロパティを Task<int> を返す「get」メソッドに変換する必要があります。

await awaitableを実行する代わりに、int を直接返したい場合は、awaitable .Resultを使用します。これにより、非同期アクションが同期的に解決され、具体的な結果を直接返すことができます。

于 2012-12-05T15:31:19.153 に答える