独自の非同期待機可能メソッドをロールするにはどうすればよいですか?
非同期メソッドを書くのは、場合によってはパイのように簡単だと思います:
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を「待機」する必要があると表示されますが、それを実行すると、まったくコンパイルされません...
待機可能を返すにはneedのみです。 Task
/Task<TResult>
は一般的な選択肢です。 Task
sは、Task.Run
(バックグラウンドスレッドでコードを実行する)またはTaskCompletionSource<T>
(非同期イベントをラップする)を使用して作成できます。
詳細については、 タスクベースの非同期パターン をお読みください。
あなたの方法
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;
}
詳細な説明 こちら 。
var something = Task<int>.Factory.StartNew(() => 0);
something.Wait();
int number = something.Result;
待っているリターンを消費するか、Task<Type of await call>
を返す必要があります
private async Task<Geoposition> TestGeo()
{
Geolocator geo = new Geolocator();
return await geo.GetGeopositionAsync();
}
private async Task<int> TestAsyncAwait()
{
return await TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5);
}