2017-12-17 10 views
0

私はXamarinアプリケーションでGPSデータを取得しようとしていますが、待ってからコードをスキップして関数を呼び出したところに戻ります。私のコードです。ここに私のコードですコードがスキップされ、呼び出し元の関数に戻る

namespace googleMap 
{ 
public partial class MainPage : ContentPage 
{ 
    public string apidata; 

    public MainPage() 
    { 
     InitializeComponent(); 
     apiDataAsync(); 
    } 
    public async void apiDataAsync() 
    { 
     await MapLoadAsync();    
    } 
    private async Task MapLoadAsync() 
    { 
     var locator = CrossGeolocator.Current; 
     locator.DesiredAccuracy = 20; 
     var ticks = 10000; 
     TimeSpan ts = new TimeSpan(ticks); 
     var location = await locator.GetPositionAsync(TimeSpan.FromSeconds(20), null, true); 
     var latitude = location.Latitude.ToString(); 
     var longitude = location.Longitude.ToString(); 
    } 
} 

私は助けていただければ幸いです。ありがとうございます。 await式が行われるまで

+1

'await'の後にコードをスキップするのではなく、' GetPositionAsync'によって返されたタスクが完了したときにコードがスケジュールされて実行されるということです。あなたは効果的に何か起こっている*起きている。あなたは本当にコンストラクタから 'MapLoadAsync'を呼び出して結果を待っていますが、コンストラクタで' await'を使うことはできません。代わりに静的なファクトリメソッドを書くことができます。あなたの要件が何であるかを正確に知るのは難しいです。 –

+1

実際に 'MapLoadAsync'とは何ですか?あなたは緯度と経度を取得していて、文字列に変換して床にドロップします。 – pstrjds

+0

@pstrjds投稿していませんが、計算後に地図上にピンを描画しています –

答えて

0

それは

var location = await locator.GetPositionAsync(TimeSpan.FromSeconds(20), null, true); 

方法に当たったときので、それがスキップされ、呼び出し元に戻ります。しかし、あなたはコンストラクターでそれを待っているわけではありません(そうすることはできません)ので、そのまま続行し、タスクは失われます。

ベストプラクティスは、新しいメインページを作成する非同期メソッドを持つファクトリを作成することです。ファクトリはawait apiDataAsync()になります。

しかし、これはapiDataAsyncの機能が長い場合にのみ適用されます。それが非常に速ければ、気にしないで、ロケータ.GetPositionAsyncを同期して呼び出してください。

var location = locator.GetPositionAsync(TimeSpan.FromSeconds(20), null, true).Result; 
関連する問題