45

独自の async awaitable メソッドをロールするにはどうすればよいですか?

場合によっては、非同期メソッドを書くのは簡単です。

private async Task TestGeo()
{
    Geolocator geo = new Geolocator();
    Geoposition pos = await geo.GetGeopositionAsync();
    double dLat = pos.Coordinate.Latitude;
    double dLong = pos.Coordinate.Latitude;
}

...しかし、悲しいことに、任意のメソッドを非同期にすることができるわけではないこともわかります。つまり、これは機能しません:

private async Task TestAsyncAwait()
{
    int i = await TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5);
}

...コンパイルエラー「Cannot await int」で停止します。設計時のヒントも同様に、「タイプ「int」は待機できません」と教えてくれます

私も同じ結果でこれを試しました:

    Task<int> i = await TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5);

メソッドを待機可能にするにはどうすればよいですか?

アップデート

Linebacker と S. Cleary が指摘したように (KNBR にいた猫との関係はありますか?)、これは機能します。

int i = await Task.Run(() => TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5));

...つまり、コンパイルされますが、「移動」することはありません。

実行時に、TestAsyncAwait() への CALL を「待機」する必要があると通知されますが、それを行うと、まったくコンパイルされません...

4

4 に答える 4

28

あなたは待っているだけを返す必要があります。Task/Task<TResult>は一般的な選択です。Tasksは、(Task.Runバックグラウンドスレッドでコードを実行するため)またはTaskCompletionSource<T>(非同期イベントをラップするため)を使用して作成できます。

詳細については、タスクベースの非同期パターンをお読みください。

于 2012-11-22T19:53:20.460 に答える
1

待っているリターンを消費するか、リターンする必要がありますTask<Type of await call>

  1. private async Task<Geoposition> TestGeo()
    {
        Geolocator geo = new Geolocator();
        return await geo.GetGeopositionAsync();
    }
    
  2. private async Task<int> TestAsyncAwait()
    {
        return await TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5);
    }
    
于 2012-11-22T20:42:00.507 に答える