2017-12-01 4 views
0

私は以下のコードをprivate async Taskの署名方法で囲んでいます。私の問題はObservableCollection<Goods> goods = new ObservableCollection<Goods>();がコードDevice.BeginInvokeOnMainThreadが完了する前に実行されるということです。 ObservableCollection<Goods> goods = new ObservableCollection<Goods>();次のコードがCで実行される前にDevice.BeginInvokeOnMainThreadが完了していることを確認してください

の前には私が使用していましたが、結果は得られません。このコードは、次の行に進む前に正しく取得できます。

助けてください。

Device.BeginInvokeOnMainThread(() => 
      { 
       Location loc = new Location(); 
       GpsData = locService.GetLocation(); 
       a = GpsData.Latitude; 
       b = GpsData.Longitude; 

      }); 



     ObservableCollection<Goods> goods = new ObservableCollection<Goods>(); 
+0

_1._メインスレッドでジオロケーションを取得しようとしていますか? UI操作ではなく、プラットフォーム/システムによって提供され、コード内のメインスレッド上で実行する必要はありません。 _2._ 'await'に必要なコードは' locService.GetLocation(); 'のみです。この' 'GetLocation'メソッドが非同期でない場合、コードを非同期にする必要はありません。 – lukya

答えて

0

このような方法でGPS位置検索コードを抽出:

async Task GetGpsData() 
{ 
    var tcs = new TaskCompletionSource<bool>(); 

    Device.BeginInvokeOnMainThread(() => { 
     try 
     { 
      Location loc = new Location(); 
      GpsData = locService.GetLocation(); 
      a = GpsData.Latitude; 
      b = GpsData.Longitude; 
      tcs.SetResult(true); 
     } 
     catch (Exception ex) 
     { 
      tcs.SetException(ex); 
     } 
    }); 

    return tcs.Task; 
} 

次のようにそれを使用する:

await GetGpsData(); 
ObservableCollection<Goods> goods = new ObservableCollection<Goods>(); 

EDIT

GetGpsData()がAでのプライベートメソッドと問題はありませんマキそれはasyncです。それでも基本的には、発信者コードもasyncでなければならないことを意味します。これが不可能な場合は、

GetGpsData().Wait(); 
ObservableCollection<Goods> goods = new ObservableCollection<Goods>(); 
+0

'tcs.Task;を返すことはできません。だから私は今すぐ除外してテストしました – jones

+0

答えのEDITを見てください。既存のコードでメソッドシグネチャを変更する必要はありません。 GetGpsData()は新しいヘルパーメソッドであり、他のコードは依存しないことに注意してください。したがって、GetGpsData()を非同期にすることは問題ありません。 –

関連する問題