线程 - 确保线程完成
本文关键字:线程 确保 | 更新日期: 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 并在引发事件时采取适当的操作。
您有几个选择:
- 阻止等待
CurrentLocation
解决。不是最好的解决方案,UI 可能会冻结等 - 实现简单的回调机制
- 检查状态并离开(即从某种等待循环中调用它)
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,这就是您在键入文本框时获得时髦的建议单词列表的方式。