Xamarin.Forms地图与async等待不相同

时间:2017-04-10 19:55:41

标签: c# xamarin xamarin.ios xamarin.forms async-await

当我尝试将地图添加到地图时,应用暂停。它不会继续执行下一段代码。只有当我从等待中调用DoWork时才会发生这种情况;但是没有呼叫等待不会停止应用程序。

暂停,我的意思是它不会崩溃应用程序它只是不执行下一行代码但我仍然​​可以与应用程序进行交互。

我是否遗漏了某些内容或使用了异步错误?

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 个答案:

答案 0 :(得分:2)

这里的问题是你需要从UI-Thread执行MoveToRegion。

如果使用Task.Run运行任务(()=&gt; ...您正在后台线程上调用它。

确保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;
});