我正在创建一个具有“我附近的”类型功能的应用程序,并且我有一些代码可以找到用户的位置。
我发现虽然调用已经完成,但异步似乎永远不会返回。
我正在使用的代码是:
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块。它似乎挂了。
有没有人对我可能做错了什么/更好的做法有任何想法?
答案 0 :(得分:2)
除非您正在编写异步事件处理程序,否则不应使用具有async void
签名的方法。无法等待这些方法,并且不会将任何抛出的异常返回给调用者。异常处理程序不会捕获此类异常。它们被传播到运行它们的线程的未处理异常处理程序。
事实上,最新一期MSDN杂志中的“Async Best Practices”文章正好提到了这个案例:
...异步Task方法抛出的任何异常都将直接在异步void方法启动时处于活动状态的SynchronizationContext上引发。图2说明了异步void方法抛出的异常无法自然捕获......
而不是async void
,您应该返回async Task
。
答案 1 :(得分: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);
}