线程 - 确保线程完成

本文关键字:线程 确保 | 更新日期: 2023-09-27 17:55:49

已求解: http://msdn.microsoft.com/en-us/library/ff431782(v=VS.92).aspx

我有以下类,它将为我在WP7中提供当前位置:

public class Position
{
    private GeoCoordinateWatcher watcher = null;
    public GeoCoordinate CurrentLocation { get; set; }
    public Position()
    {
        ObtainCurrentLocation();
    }
    private void ObtainCurrentLocation()
    {
        watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.Default);
        watcher.PositionChanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(watcher_PositionChanged);
        watcher.Start();
    }
    void watcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
    {
        //stop & clean up, we don't need it anymore
        watcher.Stop();
        watcher.Dispose();
        watcher = null;
        CurrentLocation = e.Position.Location;
    }
}

我想用它来获取位置。所以我所做的就是实例化它。如何确保在调用 CurrentLocation 属性时,已获取该位置?

线程 - 确保线程完成

首先,我强烈建议避免在类实例化时自动获取位置。这使很多事情复杂化。其次,我建议通过方法返回GeoCoordinate。假设您有一个将返回结果的public GeoCoordinate GetCoordinate() - 以这种方式使用它。这将使以同步方式获取数据变得更加容易。

可以使 Position 类实现 INotifyPropertyChanged 并在 CurrentLocation 属性的值发生更改时引发 PropertyChanged。

然后,依赖于 CurrentLocation 的代码将侦听 Position.PropertyChanged 并在引发事件时采取适当的操作。

您有几个选择:

  1. 阻止等待CurrentLocation解决。不是最好的解决方案,UI 可能会冻结等
  2. 实现简单的回调机制
  3. 检查状态并离开(即从某种等待循环中调用它)

SOLVED: http://msdn.microsoft.com/en-us/library/ff431782(v=VS.92).aspx

我很

惊讶人们不知道这些东西,网络上充斥着教程和文本,这是常见的话题之一。

这里有一个不太大的好入门:Silverlight for Windows Phone - 学习和实践

在这里,可以从Microsoft出版社免费获得,是Charles Petzold的编程Windows Phone 7

令人惊讶的是,虽然第一本书是一些晦涩难懂的印度尼西亚人用英语写的,但它很容易理解,它包含 Petzold 中没有的重要内容 - 例如如何使用 InputScope,这就是您在键入文本框时获得时髦的建议单词列表的方式。