在Timer回调中创建MapIcon

时间:2016-04-24 15:10:04

标签: c# multithreading timer win-universal-app

我正在创建一个小型通用Windows应用程序。我想使用MapControl来呈现从Internet下载的一些数据。这些数据每分钟刷新一次,我希望每次发生时都更新MapIcons的位置。 所以......加载地图后,我创建一个每60秒运行一次的Timer,使用HttpWebRequest下载数据,然后解析收到的JSON,然后更新MapControl中显示的MapIcons的位置。

一切都应该可以正常工作,但是当我在Timer回调中调用新的MapIcon()时,我有一个例外:

  

newproject.exe中发生了'System.Exception'类型的异常,但未在用户代码中处理

     

附加信息:该应用程序称为为不同线程编组的接口。 (来自HRESULT的异常:0x8001010E(RPC_E_WRONG_THREAD))

我的定时器回调代码是:

func1()

2 个答案:

答案 0 :(得分:1)

请尝试使用Dispatcher。您需要在UI线程上添加MapIcon对象。

    private async void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => 
        {
            // Your Code
        });
    }

答案 1 :(得分:0)

虽然Jean-Sébastien Dupuy's answer在技术上是正确的,但另一种选择是使用HttpClient而不是HttpWebRequest并使用await关键字来确保所有内容都在正确的线程上自动运行。 (还要确保你使用的是DispatcherTimer而不是其他类型的计时器。