2017-02-13 7 views
0

私のアプリでジオコーディングとReverseGeoCodingを処理するヘルパークラスを作りたいと思います。XamarinフォームGetAddressesForPositionAsync

私の挑戦は、次のコード行が実際に呼び出しの結果を待っているようではないということです。

var possibleAddresses = await iobj_Geocoder.GetAddressesForPositionAsync(pobj_Position); 

アドレスの結果が取得される前に、制御が呼び出し元のイベントに戻されます。どのようにこの仕事をするにはどんな助けも大歓迎です。

ヘルプクラスコード:

using System.Linq; 
using Xamarin.Forms.Maps; 

namespace MapProblems 
{ 
    public class MapHelper 
    { 
     private Geocoder iobj_Geocoder; 
     public string Address { get; set; } 

     public MapHelper() 
     { 
      iobj_Geocoder = new Geocoder(); 
     } 

     public async void GeoCodeAddress(Position pobj_Position) 
     { 

      var possibleAddresses = await iobj_Geocoder.GetAddressesForPositionAsync(pobj_Position); 

      Address = possibleAddresses.ToList()[0]; 
     } 

    } 
} 

ヘルパークラスのC#ファイルを呼び出すメインページ:

using System; 
using System.Diagnostics; 
using Xamarin.Forms; 
using Xamarin.Forms.Maps; 
namespace MapProblems 
{ 
    public partial class MainPage : ContentPage 
    { 
     MapHelper iobj_MapHelper; 
     public MainPage() 
     { 
      InitializeComponent(); 
      iobj_MapHelper = new MapHelper(); 
      this.Appearing += MainPage_Appearing; 

     } 

     private async void MainPage_Appearing(object sender, EventArgs e) 
     { 
      Device.BeginInvokeOnMainThread(() => 
      { 
       iobj_MapHelper.GeoCodeAddress(new Position(38.9047, -077.0310)); 
      } 
      ); 

      Debug.WriteLine("Address: " + iobj_MapHelper.Address); 
     } 
    } 
} 

したがって、この例の最終結果はアドレスであるときDebug.WriteLine任意の空の文字列ですコードが実行されます。

ご協力いただければ幸いです。

答えて

1

GeoCodeAddressメソッドがasync voidであるため、コードは終了時を知る方法がありません。その非同期タスク作ってみましょう:

public async Task<string> GeoCodeAddress(Position pobj_Position) 
{ 
    var possibleAddresses = await iobj_Geocoder.GetAddressesForPositionAsync(pobj_Position); 
    return possibleAddresses.ToList()[0]; 
} 

次にあなたがそうのようにそれを呼び出すことができます。

private async void MainPage_Appearing(object sender, EventArgs e) 
{ 
    var address = await iobj_MapHelper.GeoCodeAddress(new Position(38.9047, -077.0310)); 
    Debug.WriteLine("Address: " + address); 
} 

また、そこに例外はあなたをクラッシュしますと、あなたは非同期無効メソッドに/キャッチを試みることを確認してくださいアプリが未処理の場合はアプリになります

+0

私は既にあなたが提案したことを試してみましたが、うまくいきませんでしたが、もう一度試してみましょう。 –

+0

それはうまくいきました。私はMSに提出した欠陥を提起しました。誰もが知っているように、Windows Phone 8.1エミュレータで上記のコードを実行すると、1つのアドレスが返されます。 Windows 10モバイルエミュレータで実行すると、ゼロアドレスが返されます。私が作成したアプリは、Windows Phone 8.1アプリのFYIです。 –