0

我试图在地图上显示一条路线,但我得到了这个例外。我不知道为什么。这是我的代码隐藏:

public partial class map_new : PhoneApplicationPage
{
    public GeoCoordinate destination;
    public GeoCoordinate myPosition;
    public Geolocator myGeolocator;
    List<GeoCoordinate> waypoints = new List<GeoCoordinate>();
    public RouteQuery routeQuery;


    public map_new()
    {
        InitializeComponent();
        destination = new GeoCoordinate(41.909859, 12.461792);
        ShowDestinationLocationOnTheMap();

        myGeolocator = new Geolocator();
        myGeolocator.DesiredAccuracy = PositionAccuracy.High;
        myGeolocator.MovementThreshold = 20; // The units are meters.
        myGeolocator.StatusChanged+=geolocator_StatusChanged;


    }

    private async Task update_position() 
    {
        Geoposition myGeoposition = await myGeolocator.GetGeopositionAsync();
        Geocoordinate myGeocoordinate = myGeoposition.Coordinate;
        myPosition = CoordinateConverter.ConvertGeocoordinate(myGeocoordinate);
        Dispatcher.BeginInvoke(() =>
        {
            this.myMap.Center = myPosition;
            this.myMap.ZoomLevel = 16;
        });
        //update_route();
    }

    private async void update_route()
    {
        await update_position();
        RouteQuery routeQuery = new RouteQuery();
        waypoints.Add(myPosition);
        waypoints.Add(destination);
        routeQuery.Waypoints = waypoints;
        routeQuery.QueryCompleted += routeQuery_QueryCompleted;
        routeQuery.QueryAsync();
    }

    void routeQuery_QueryCompleted(object sender, QueryCompletedEventArgs<Route> e)
    {
        if (e.Error == null)
        {
            Route MyRoute = e.Result;
            MapRoute MyMapRoute = new MapRoute(MyRoute);
            myMap.AddRoute(MyMapRoute);
            routeQuery.Dispose();
        }
    }

    void geolocator_StatusChanged(Geolocator sender, StatusChangedEventArgs args)
    {
        string status = "";

        switch (args.Status)
        {

            case PositionStatus.Ready:
                // the location service is generating geopositions as specified by the tracking parameters
                status = "ready";
                update_route();
                break;

    }

我认为错误是 update_route() 不等待 update_position() 完成,但我不知道如何设置 update_route() 等待。任何的想法?

编辑:应用 KooKiz 和 Stephen 解决方案后,错误位于此行:

RouteQuery routeQuery = new RouteQuery();
4

2 回答 2

3

“无效的跨线程访问”通常发生在尝试从后台线程更新 UI 时。就您而言,我相信这是您尝试更新myMap控件的时候。

要从 UI 线程更新控件,可以使用以下Dispatcher.BeginInvoke方法:

private async void update_position() 
{
    Geoposition myGeoposition = await myGeolocator.GetGeopositionAsync();
    Geocoordinate myGeocoordinate = myGeoposition.Coordinate;
    myPosition = CoordinateConverter.ConvertGeocoordinate(myGeocoordinate);
    Dispatcher.BeginInvoke(() =>
    {
            this.myMap.Center = myPosition;
            this.myMap.ZoomLevel = 16;
    });
    //update_route();
}

编辑:显然,RouteQuery 对象也需要在 UI 线程上实例化。update_route然后我建议在 UI 上调用整个方法:

        case PositionStatus.Ready:
            // the location service is generating geopositions as specified by the tracking parameters
            status = "ready";
            Dispatcher.BeginInvoke(() => update_route());
            break;

(然后Dispatcher.BeginInvokeupdate_position方法中删除)

于 2013-09-06T11:14:05.727 回答
0

你应该避免async void。相反,使用async Task,它允许您await返回Task. async void应该只用于事件处理程序。

我的博客上有一个介绍async,您可能会觉得有帮助。

于 2013-09-06T11:25:25.097 回答