2017-04-10 13 views
0

ピンをマップに追加しようとすると、アプリケーションが停止します。次のコードを実行し続けることはありません。これは私がDoWorkを待っているときにのみ発生します。しかし、呼び出しを待つことは、アプリケーションを停止しません。Xamarin.Formsマップが非同期で待たされるのを待つ

停止すると、アプリケーションがクラッシュすることはなく、次のコード行は実行されませんが、まだアプリケーションと対話できます。

何かが見つからないか、非同期を間違って使用していますか?

Map myMap; 
public MyViewModel(Map map) 
{ 
    myMap = map; 

    // Causes crash 
    Task.Run(async() => 
    { 
     await DoWork(); 
    }); 

    // Causes no crashes 
    //DoWork(); 
} 

async Task<bool> DoWork() 
{ 
    var success = false; 

    Task<bool> task = null; 
    task = SomeTask(); 
    if (await task) 
    { 
     var pin = MyPin();  
     myMap.Pins.Add(pin); 

     // This is never called when calling await Dowork(). Application stops. 
     myMap.MoveToRegion(MapSpan.FromCenterAndRadius(MyPosition(), Distance.FromMiles(5))); 
     success = true; 
    } 

    return success; 
} 

public Pin MyPin() 
{ 
    var pin = new Pin(); 
    pin.Type = PinType.Place; 
    pin.Position = new Position(<latitude>, <longitude>); 
    return pin; 
} 

答えて

1

ここでの問題は、UIスレッドからMoveToRegionを実行する必要があることです。

場合Task.Run(()でタスクを実行している=> ...あなたは、バックグラウンドスレッドで、それを呼び出している。

は、UI操作がmainthreadで行われますが

それを強制できることを確認します
Device.BeginInvokeOnMainThread(() => 
{ 

    var pin = MyPin();  
    myMap.Pins.Add(pin); 

    // This is never called when calling await Dowork(). Application stops. 
    myMap.MoveToRegion(MapSpan.FromCenterAndRadius(MyPosition(), Distance.FromMiles(5))); 
    success = true; 
}); 
+0

私はそれを逃したとは思わない! – MartDavious

関連する問題