C# Xamarin.表单映射不';无法使用异步等待

C# Xamarin.表单映射不';无法使用异步等待,c#,xamarin,xamarin.ios,xamarin.forms,async-await,C#,Xamarin,Xamarin.ios,Xamarin.forms,Async Await,当我尝试在地图上添加pin时,应用程序会停止。它不会继续执行下一段代码。只有当我从等待中调用DoWork时才会发生这种情况;但是,不调用wait不会停止应用程序 所谓暂停,我的意思是它不会使应用程序崩溃,它只是不执行下一行代码,但我仍然可以与应用程序交互 我是否遗漏了什么或使用异步错误 Map myMap; public MyViewModel(Map map) { myMap = map; // Causes crash Task.Run(async () =>

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

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

我是否遗漏了什么或使用异步错误

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;
}
Map-myMap;
公共MyViewModel(地图)
{
myMap=map;
//导致崩溃
Task.Run(异步()=>
{
等待嫁妆();
});
//不会导致崩溃
//销钉();
}
异步任务DoWork()
{
var成功=false;
Task=null;
task=SomeTask();
如果(等待任务)
{
var pin=MyPin();
myMap.Pins.Add(pin);
//调用Wait Dowork()时从不调用此函数。应用程序停止。
myMap.MoveToRegion(MapSpan.FromCenterAndRadius(MyPosition(),Distance.FromMiles(5));
成功=真实;
}
回归成功;
}
公共密码MyPin()
{
var引脚=新引脚();
pin.Type=PinType.Place;
销位置=新位置(,);
回位销;
}

这里的问题是您需要从UI线程执行MoveToRegion

如果使用task.Run(()=>)运行任务,则在后台线程上调用它

要确保ui操作在主线程上完成,可以强制它

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

真不敢相信我错过了!