0

我有一个 Singleton 类 LocationManager,它处理我的 Windows Metro 应用程序中的所有地理位置。

因为来自 Geolocator 对象的 .PositionChanged 事件通常在后台线程上引发,所以我想将我的类传递给 CoreDispatcher 的引用,以便它可以在 UI 线程上自动引发自己的事件。例如:

public class LocationManager
{
    // Events
    public event EventHandler<LocationUpdatedEventArgs> LocationUpdated = delegate { };

    // Private members
    Geolocator gl = null;
    CoreDispatcher dispatcher = null;

    public void StartUpdating(CoreDispatcher dispatcher)
    {
        this.dispatcher = dispatcher;

        gl = new Geolocator();
        gl.PositionChanged += gl_PositionChanged;
    }

    async void gl_PositionChanged(Geolocator sender, PositionChangedEventArgs args)
    {
        // Ensure this class's event is raised on UI thread
        await dispatcher.RunAsync(CoreDispatcherPriority.Normal,  () => 
            {
                LocationUpdated(this,  new LocationUpdatedEventArgs(args.Position));
            }
        );   
    }

我想知道我是否应该将 dispatcher.RunAsync 的东西放在我的每个监听 UI 对象中(即 MainPage.xaml.cs)——但这种方法似乎可以节省代码的重复。这种方法有什么缺点吗?例如,对调度程序的引用是否会变得陈旧或无效?

4

2 回答 2

0

就个人而言,我避免将Dispatcher(或类似的)对象放置在 UI 层之上的任何层中。SynchronizationContext更好。

在您的情况下,我将采用使用Dataflow的方法(可以使用Rx完成非常相似的事情):

public class LocationManager
{
  // Events
  public event EventHandler<LocationUpdatedEventArgs> LocationUpdated = delegate { };

  // Private members
  Geolocator gl = null;
  ActionBlock<PositionChangedEventArgs> block = null;

  public void StartUpdating()
  {
    // Set up the block to raise our event on the UI thread.
    block = new ActionBlock<PositionChangedEventArgs>(
        args =>
        {
          LocationUpdated(this, new LocationUpdatedEventArgs(args.Position));
        },
        new ExecutionDataflowBlockOptions
        {
          TaskScheduler = TaskScheduler.FromCurrentSynchronizationContext(),
        });

    // Start the Geolocator, sending updates to the block.
    gl = new Geolocator();
    gl.PositionChanged += (sender, args) =>
    {
      block.Post(args);
    };
  }
}
于 2012-08-30T17:26:09.280 回答
0

你考虑过观察者模式吗?

您所描述的听起来像是发布者 - 订阅者关系。当发布者有东西要发布时,所有订阅者都会收到该发布。您的发布者不必是单例的,但它可以是。这有帮助吗?

于 2012-08-30T16:29:08.620 回答