GeoCoordinateWatcher 只能偶尔工作一次

Ori*_*n31 1 c# wpf location

以下代码尝试获取正在运行代码的计算机的位置:

GeoCoordinateWatcher watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.High);
if (watcher.TryStart(false, TimeSpan.FromMilliseconds(3000)))
{
    GeoCoordinate coord = watcher.Position.Location;
    if (!coord.IsUnknown)
    {
        Printer.Print(String.Format("Current Lat: {0}, Current Long: {1}", coord.Latitude, coord.Longitude));
    }
    else // Path taken most often
    {
        throw new CommandException("Weather data unknown. (Are location services enabled?)"); 
    }
}
else
{
    throw new CommandException("Weather data unknown. (Are location services enabled?)");
}
Run Code Online (Sandbox Code Playgroud)

每隔一段时间,就会打印正确的位置,但大多数时候,会运行注释的 else 语句。经过多次测试,我意识到它是否有效完全是随机的。我这样做错了吗?

Ste*_* Py 5

您遇到问题的原因可能是您正在初始化一个新的定位器,但在检查位置之前没有等待状态报告它已准备好。

bool abort = false;
GeoCoordinateWatcher watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.High);
if (watcher.TryStart(false, TimeSpan.FromMilliseconds(3000)))
{
    DateTime start = DateTime.Now;
    while(watcher.Status != GeoPositionStatus.Ready && !abort)
    {
        Thread.Sleep(200);
        if(DateTime.Now.Subtract(start).TotalSeconds > 5)
            abort = true;
    }

    GeoCoordinate coord = watcher.Position.Location;
    if (!coord.IsUnknown)
    {
        Printer.Print(String.Format("Current Lat: {0}, Current Long: {1}", coord.Latitude, coord.Longitude));
    }
    else // Path taken most often
    {
        throw new CommandException("Weather data unknown. (Are location services enabled?)"); 
    }
}
else
{
    throw new CommandException("Weather data unknown. (Are location services enabled?)");
}
Run Code Online (Sandbox Code Playgroud)

基本上,这会添加一个检查以查看状态是否已就绪并等待最多 5 秒。

或者,观察器通常应该在模块级别设置并注册事件PositionChanged,以便您仅在位置实际发生变化时更新打印输出,而不是在静止时一次又一次重申当前位置的轮询循环。