我正在使用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);
}
}
}
任何?
答案 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
工作正常=)