线程 - 确保线程完成

时间:2011-05-10 21:54:01

标签: c# multithreading windows-phone-7 thread-safety

已解决: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属性时,如何确保获取该位置?

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

依赖于CurrentLocation的代码将侦听Position.PropertyChanged并在引发事件时采取适当的行动。

答案 2 :(得分:1)

您有几个选择:

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

答案 3 :(得分:1)

答案 4 :(得分:-1)

我很惊讶人们不知道这些东西,网上有很多教程和文字,这是一个平常的主题。

这是一个不太大的好的入门书:Silverlight for Windows Phone - learn & practise

此处,微软出版社免费提供,是Charles Petzold的Programming Windows Phone 7

令人惊讶的是,虽然第一本书是由一些晦涩的印度尼西亚人在英文错误中的一个瘦小的东西,它很容易遵循,它包含不在Petzold中的重要内容 - 例如如何使用InputScope,这就是你如何得到它在键入TextBox时,建议单词的常规列表。