2011-03-04 73 views
1

我正在使用WebClient對象來輪詢服務器中的一些數據。 它工作良好,它更新文本塊罰款。直到我不使用同一頁上的地圖。當我添加地圖時,只有一個請求完成,數據只能被檢索一次。 這是獲取消息的代碼:WP7 WebClient DownloadStringAsync和Map

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); 
      } 
     } 
    } 

任何人?

回答

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 

工作正常=)

1

WebClient的反應是在UI線程處理 - 所以你不需要lock那你有你的事件處理程序。

針對您的特定問題 - 這是否發生在模擬器中?我已經看到了很多仿真器的計時器問題 - 但從來沒有真正的手機上有類似的問題。另外,我相信在一般情況下,最好使用HttpWebRequest而不是WebClient - 請參閱使用UI線程的webclient的說明Silverlight Background Thread using WebClient - 對於您的特定代碼,我不認爲這會是一個問題。