web-dev-qa-db-ja.com

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

独自の非同期待機可能メソッドをロールするにはどうすればよいですか?

非同期メソッドを書くのは、場合によってはパイのように簡単だと思います:

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));

...つまり、compiles-しかし、「動く」ことはありません。

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

43
B. Clay Shannon

待機可能を返すにはneedのみです。 Task/Task<TResult>は一般的な選択肢です。 Tasksは、Task.Run(バックグラウンドスレッドでコードを実行する)またはTaskCompletionSource<T>(非同期イベントをラップする)を使用して作成できます。

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

26
Stephen Cleary

あなたの方法

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

このように書かれるべきです

private async Task TestAsyncAwait()
{
    Task<int> t = new Task<int>(() =>
    {
        return TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5);
    });
    t.Start();
    await t;
}

Intを返す必要がある場合は、タスクタイプを置き換えます。

private async Task<int> TestAsyncAwait()
{
    Task<int> t = new Task<int>(() =>
    {
        return TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5);
    });
    t.Start();
    return await t;
}

詳細な説明 こちら

17
Jeson Martajaya
var something = Task<int>.Factory.StartNew(() => 0);
something.Wait();
int number = something.Result;
2
p3n

待っているリターンを消費するか、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);
    }
    
1
Mayank