0

我正在创建一个具有“我附近有什么”类型功能的应用程序,并且我有一些代码可以找到用户的位置。

我发现虽然调用已完成,但异步似乎永远不会返回。

我正在使用的代码是:

GeoCoordinate coord;
private async void GetNearMe()
{
    try
    {
        Geolocator geolocator = new Geolocator();
        Geoposition geoposition = await geolocator.GetGeopositionAsync();

        coord = geoposition.Coordinate.ToGeoCoordinate();
    }
    catch (Exception ex)
    {
        <snip>
    }
}

但是代码有时只到达“coord =”行(并返回正确的数据)。如果是这样,由于某种原因,它可能不会再次出现。如果它不起作用,它也永远不会到达 catch 块。它似乎只是挂起。

有没有人知道我可能做错了什么/更好的方法?

  • 我正在使用 Caliburn Micro,它位于称为 OnActivate 的 ViewModel 中。
  • 我在模拟器和我的 Lumia 920 上都试过了,两者都发生了。
  • 我尝试关闭并再次打开定位服务,没有任何变化。
4

2 回答 2

2

async void除非您正在编写异步事件处理程序,否则您不应该使用带有签名的方法。不能等待此类方法,并且在其中抛出的任何异常都不会返回给调用者。此类异常不会被异常处理程序捕获。它们被传播到运行它们的线程的未处理异常处理程序。

事实上,最新版 MSDN 杂志封面中的“异步最佳实践”文章正是提到了这种情况:

...从异步 Task 方法抛出的任何异常都将直接在异步 void 方法启动时处于活动状态的 SynchronizationContext 上引发。图 2 说明了从异步 void 方法抛出的异常不能自然地被捕获......

而不是async void你应该返回async Task

于 2013-03-21T13:49:37.333 回答
0

改为使用 GeoCoordinateWatcher,

GeoCoordinate coord;    
GeoCoordinateWatcher watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.High);
    watcher.PositionChanged += (s,ea) =>
    {
    coord = new Geocoordinate(ea.Position.Location.Latitude, ea.Position.Location.Longitude);

    }
于 2013-08-03T18:33:24.367 回答