0

「近くにあるもの」タイプの機能を備えたアプリを作成しており、ユーザーの場所を見つけるためのコードをいくつか持っています。

呼び出しは行われますが、非同期は返されないようです。

私が使用しているコードは次のとおりです。

GeoCoordinate coord;
private async void GetNearMe()
{
    try
    {
        Geolocator geolocator = new Geolocator();
        Geoposition geoposition = await geolocator.GetGeopositionAsync();

        coord = geoposition.Coordinate.ToGeoCoordinate();
    }
    catch (Exception ex)
    {
        <snip>
    }
}

しかし、コードが "coord = " 行にたどり着く (そして正しいデータを返す) ことはたまにしかありません。もしそうなら、おそらく何らかの理由で二度とないでしょう。また、動作しない場合は catch ブロックに到達しません。ハングしているようです。

私が間違っていること/より良い方法について何か考えがある人はいますか?

  • Caliburn Micro を使用していますが、これは OnActivate と呼ばれる ViewModel にあります。
  • エミュレーターと Lumia 920 で試しましたが、両方で発生します。
  • 位置情報サービスをオフにしてから再度オンにしてみましたが、変化はありませんでした。
4

2 に答える 2

2

async void非同期イベント ハンドラーを作成する場合を除き、署名付きのメソッドを使用しないでください。このようなメソッドは待機できず、それらの内部でスローされた例外は呼び出し元に返されません。このような例外は、例外ハンドラーによってキャッチされません。それらは、それらを実行するスレッドの未処理の例外ハンドラーに伝達されます。

実際、MSDN マガジンの最新版の記事「 Async Best Practices 」では、まさにこのケースについて言及しています。

... async Task メソッドからスローされた例外は、async void メソッドが開始されたときにアクティブだった SynchronizationContext で直接発生します。図 2 は、async void メソッドからスローされた例外を自然にキャッチできないことを示しています...

代わりにasync voidを返す必要がありますasync Task

于 2013-03-21T13:49:37.333 に答える