Windows Metro アプリですべての地理位置情報を処理する LocationManager というシングルトン クラスがあります。
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));
}
);
}
代わりに、リッスンしている各 UI オブジェクト (つまり、MainPage.xaml.cs) に dispatcher.RunAsync のものを配置する必要があるかどうか疑問に思いますが、このアプローチはコードの重複を節約するようです。このアプローチに欠点はありますか? たとえば、ディスパッチャへの参照が古くなったり無効になったりすることはありませんか?