【问题标题】:Exception when calling Bing.Maps.Location class constructor调用 Bing.Maps.Location 类构造函数时出现异常
【发布时间】:2013-04-24 14:33:35
【问题描述】:

在为 Windows 8 商店应用程序使用 Bing 地图控件时,在非 UI 线程上创建新的 Location object 会导致异常。

WinRT 信息:应用程序调用的接口是 为不同的线程编组。

通常这意味着我不正确地尝试从后台线程更新 UI,但事实并非如此,因为这可以通过在空的 Windows 8 商店应用程序项目中放置一个按钮来重现:

<Button Content="Click me" Click="Button_Click"/>

并像这样添加一个事件处理程序:

private void Button_Click(object sender, RoutedEventArgs e)
{
    Task.Run(() =>
    {
        var loc = new Location(1, 1);
    });
}

Location 结构的构造函数真的在 UI 线程上做了什么,还是我在这里遗漏了什么?

【问题讨论】:

    标签: c# windows-8 winrt-xaml bing-maps


    【解决方案1】:

    我没有进入代码来查看 Bing 地图类中发生了什么,但是您不能在 UI 线程之外创建任何 Bing 地图“UI”对象。 我认为构造函数只测试它是否在主线程上被调用,如果不是则抛出异常。

    这意味着您必须在 UI 线程上实例化您的 Location 对象,还必须实例化您的折线、引脚、图层等。

    将添加到地图控件的任何元素都必须在 UI 线程中创建。

    【讨论】:

    • 是的,就是这样。虽然没有恢复到在 UI 线程上实例化它们。就我而言,更好的解决方案是使用我自己的坐标结构代替位置。所以我想真的没有必要在非 UI 线程上实例化 Location 对象。
    • 没错。如果以后需要实例化大量的 bing 地图对象(在构建复杂的地图显示时),我建议在另一个线程上创建自己的对象/结构,然后在 UI 线程上将它们转换为 bing 地图对象。这样,任何繁重的进程都将是异步的,只有实际的 bing 地图对象会在主线程上。
    猜你喜欢
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 2015-12-22
    相关资源
    最近更新 更多