Skip to main content
 首页 » 编程设计

c#之Xamarin.Forms Map 与异步等待不兼容

2024年02月27日34zhenyulu

当我尝试向 map 添加图钉时,应用程序停止运行。它不会继续执行下一段代码。只有当我从 await 调用 DoWork 时才会发生这种情况;然而,不调用 await 不会停止应用程序。

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

我是不是遗漏了什么或使用了错误的异步?

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

请您参考如下方法:

这里的问题是您需要从 UI-Thread 执行 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; 
});