WP7 WebClient DownloadStringAsync和Map

时间:2011-03-04 18:40:43

标签: windows-phone-7 map webclient

我正在使用WebClient对象从服务器轮询一些数据。 它运行良好,它正在更新文本块。直到我不在同一页面上使用地图。添加地图时,只有一个请求完成,数据只检索一次。 这是获取消息的代码:

    public MessagesPage()
    {
        InitializeComponent();
        new System.Threading.Timer(messagePolling, null, 0, 5000);   // every 5 seconds
    }

    void messagePolling(object state)
    {
        getMessages(Const.GET_MESSAGES_URL + uuid);
    }

    private void getMessages(string uri)
    {
        WebClient webClient = new WebClient();
        webClient.DownloadStringAsync(new Uri(uri));
        webClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(messagesResponseCompleted);
    }

    void messagesResponseCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        lock (this)
        {
            try
            {
                string s = e.Result;
                if (s.Length > 0)
                {
                    List<Message> messagesResult = JSONHelper.Deserialize<List<Message>>(s);
                    foreach (Message m in messagesResult)
                    {
                        tbMessages.Text += m.message + "\n";
                    }
                }
                else
                {
                    tbMessages.Text += "No new messages @: " + System.DateTime.Now + "\n";
                }
            }
            catch (System.Net.WebException we)
            {
                MessageBox.Show(we.Message);
            }
        }
    }

任何?

2 个答案:

答案 0 :(得分:1)

WebClient响应在UI线程上处理 - 因此您不需要事件处理程序中的lock

对于您的特定问题 - 这是发生在模拟器中吗?我在仿真器上看到了很多计时器问题 - 但真正的手机上没有类似的东西。

顺便说一句,我相信一般来说最好使用HttpWebRequest而不是WebClient - 请参阅此处有关使用UI线程Silverlight Background Thread using WebClient的webclient的说明 - 对于您的特定代码我不要我认为这将是一个问题。

答案 1 :(得分:0)

如果使用

        System.Windows.Threading.DispatcherTimer myDispatcherTimer = new System.Windows.Threading.DispatcherTimer();
        myDispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 5000);
        myDispatcherTimer.Tick += new EventHandler(messagePolling);
        myDispatcherTimer.Start();

而不是

new System.Threading.Timer(messagePolling, null, 0, 5000);   // every 5 seconds

工作正常=)