WP7 WebClient DownloadStringAsync и Карта - PullRequest
1 голос
/ 04 марта 2011

Я использую объект 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 ]

1 голос
/ 04 марта 2011

Ответ WebClient обрабатывается в потоке пользовательского интерфейса - поэтому вам не нужно lock, которое есть в вашем обработчике событий.

Для вашей конкретной проблемы - это происходит только в эмуляторе?Я видел довольно много проблем с таймером с эмулятором - но никогда не было ничего похожего на реальном телефоне.

В целом, я считаю, что в целом лучше использовать HttpWebRequest, а не WebClient - смотритеобъяснение здесь веб-клиента с использованием пользовательского интерфейса фоновый поток Silverlight с использованием веб-клиента - для вашего конкретного кода я не думаю, что это будет проблемой.

0 голосов
/ 04 марта 2011

При использовании

        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

работает нормально =)

...