2011-07-20 33 views
0

我有一个ListBox〜40-150项。当我点击更新按钮时,我的应用程序会在后台线程中检查新消息和消息。如果有消息或新闻更新,应用程序将显示通知。即使没有新消息或消息项目,我的列表框也会刷新,但仍不会响应1-10秒。如何在这种情况下禁用更新? 我的代码很清晰,这个线程在后台运行。我也有video of the problem如何在WP7中每次都拒绝更新/刷新ListBox?

private void UpdateNews(object sender, EventArgs e) { 
      DispatcherTimer timer = new DispatcherTimer() { 
      }; 
      timer.Tick += (a, b) => { 
       timer.Stop(); 
       getData("post_upd"); 
       }; 
      timer.Start(); 
      ProgBar.IsIndeterminate = true; 
      ProgBar.Visibility = System.Windows.Visibility.Visible; 
     } 

public void getData(string filtr) { 
      lock (this) { 

        Debug.WriteLine("News: Getting Data"); 
        WebClient c = new WebClient(); 
        WebClient b = new WebClient(); 
        DateTime from = DateTime.Now.AddHours(-30); 

        if (filtr == "post") { 

         b.DownloadStringAsync(new Uri("https://api.vkontakte.ru/method/getServerTime?access_token=" + ((App)Application.Current).access_token)); 
         b.DownloadStringCompleted += new DownloadStringCompletedEventHandler(server_time_update); 


        } 
        if (filtr == "post_upd") { 
         DispatcherTimer timer = new DispatcherTimer() { 
         }; 
         timer.Tick += (a, q) => { 
          timer.Stop(); 
          b.DownloadStringAsync(new Uri("https://api.vkontakte.ru/method/getServerTime?access_token=" + ((App)Application.Current).access_token)); 
          b.DownloadStringCompleted += new DownloadStringCompletedEventHandler(server_time_update); 
          c.DownloadStringAsync(new Uri("https://api.vkontakte.ru/method/newsfeed.get?start_time=" + ((App)Application.Current).server_time + "&filters=post" + "&access_token=" + ((App)Application.Current).access_token)); 
          c.DownloadStringCompleted += new DownloadStringCompletedEventHandler(posts_update); 
          newslistBox.PullSubtext = "Обновлено в " + DateTime.Now.ToString("HH:mm:ss"); 
         }; 
         timer.Start(); 

        } 
      } 

private void after_server_time_update(string filtr) { 
      WebClient c = new WebClient(); 
      c.DownloadStringAsync(new Uri("...?start_time=" + (((App)Application.Current).server_time - 8600) + "&filters=" + filtr + "&access_token=" + ((App)Application.Current).access_token)); 
      c.DownloadStringCompleted += new DownloadStringCompletedEventHandler(posts_downloaded); 
      newslistBox.PullSubtext = "Обновлено в " + DateTime.Now.ToString("HH:mm:ss"); 
     } 
    private void posts_downloaded(object sender, DownloadStringCompletedEventArgs e) { 
      if (e.Error == null && (NetworkInterface.GetIsNetworkAvailable())) { 
       lock (this) { 
        Debug.WriteLine("News: Posts Downloaded online"); 
        string json = e.Result; 
        var response = JObject.Parse(json); 
        // Debug.WriteLine(response); 
        string att_type = ""; 
        list = new List<Data>(); 
        prof_list = new List<Profiles>(); 
        groups_list = new List<Groups>(); 
        Profiles p_item = null; 
        Groups g_item = null; 
         #region SWTICH 
         switch (att_type) { 
          case "photo":... 
           break; 
          case "graffiti":... 
           list.Add(item); 
           break; 
          case "audio":... 
           }; 
           list.Add(item); 
           break; 
          case "link":...}; 
           list.Add(item); 
           break; 
          case "note": 
           item = new Data {... 
           list.Add(item); 
           break; 
          case "post":... 
           list.Add(item); 
           break; 
          case "poll": 
           item = new Data {.... 
           list.Add(item); 
           break; 
          case "video":.... 
           list.Add(item); 
           break; 
         } 
         #endregion 
        } 
        this.newslistBox.ItemsSource = list; 

        ProgBar.IsIndeterminate = false; 
        ProgBar.Visibility = Visibility.Collapsed; 
       } 
      } else { 
       ToastPrompt toast = new ToastPrompt(); 
       // Debug.WriteLine(who.ToString()); 
       // Debug.WriteLine(who.FirstOrDefault()[4].ToString()); 
       toast.TextOrientation = System.Windows.Controls.Orientation.Vertical; 
       toast.Title = "Ошибка"; 
       toast.Message = "Нет соединения с интернетом"; 
       toast.MillisecondsUntilHidden = 7000; 
       toast.Show(); 
      } 
     } 
     private void posts_update(object sender, DownloadStringCompletedEventArgs e) { 
      if (e.Error == null && (NetworkInterface.GetIsNetworkAvailable())) { 
       lock (this) { 
        Debug.WriteLine("News: Posts Updated online"); 
        string json = e.Result; 
        var response = JObject.Parse(json); 
        if (response["response"]["items"].HasValues) { 
         // Debug.WriteLine(response); 
         string att_type = ""; 
         //list = new List<Data>(); 
         prof_list = new List<Profiles>(); 
         groups_list = new List<Groups>(); 
         Profiles p_item = null; 
         Groups g_item = null; 

         #region FOR I ITems 
         for (int i = 0; i < response["response"]["profiles"].Count(); i++) { 
          p_item = new Profiles() { 
           p_firstname = response["response"]["profiles"][i]["first_name"].ToString(), 
           p_lastname = response["response"]["profiles"][i]["last_name"].ToString(), 
           p_profile_image = response["response"]["profiles"][i]["photo"].ToString(), 
           p_uid = (int)response["response"]["profiles"][i]["uid"] 
          }; 
          //prof_list.Insert(p_item); 
          prof_list.Add(p_item); 
         } 
         for (int i = 0; i < response["response"]["groups"].Count(); i++) { 
          g_item = new Groups() { 
           g_name = response["response"]["groups"][i]["name"].ToString(), 
           g_photo = response["response"]["groups"][i]["photo"].ToString(), 
           g_uid = (int)response["response"]["groups"][i]["gid"] 
          }; 
          groups_list.Add(g_item); 
         } 
         for (int i = 0; i < response["response"]["items"].Count(); i++) { 
          if (response["response"]["items"][i].ToString().Contains("attachment")) { 
           string type = response["response"]["items"][i]["attachment"]["type"].ToString(); 
           if (type == "photo" || type == "posted_photo") 
            att_type = "photo"; 
           else if (type == "audio") 
            att_type = "audio"; 
           else if (type == "link") 
            att_type = "link"; 
           else if (type == "note") 
            att_type = "note"; 
           else if (type == "poll") 
            att_type = "poll"; 
           else if (type == "graffiti") 
            att_type = "graffiti"; 
           else if (type == "video") 
            att_type = "video"; 
           else 
            Debug.WriteLine("Error news.xmal postdown", type); 
          } else 
           att_type = "post"; 
          Data item = null; 
          var items = response["response"]["items"]; 
          string to_autorname = ""; 
          string to_auth = ""; 
          if ((int)items[i]["source_id"] > 0) { 
           var x = from z in prof_list 
             where z.p_uid == (int)items[i]["source_id"] 
             select z; 
           to_autorname = x.FirstOrDefault().p_profile_image; 
           to_auth = x.FirstOrDefault().p_firstname + " " + x.FirstOrDefault().p_lastname; 
          } else { 
           var x = from z in groups_list 
             where z.g_uid == -(int)items[i]["source_id"] 
             select z; 
           to_autorname = x.FirstOrDefault().g_photo; 
           to_auth = x.FirstOrDefault().g_name; 
          } 
         #endregion 
          #region SWTICH 
          switch (att_type) { 
           case "photo": 
            item = new Data { 
             attachment_type = "photo", 
             image_src = items[i]["attachment"]["photo"]["src"].ToString(), 
             image_src_big = items[i]["attachment"]["photo"]["src_big"].ToString(), 
             text = items[i]["text"].ToString().Replace("<br>", "\n").Replace("&quot;", "\""), 
             likes_count = (int)items[i]["likes"]["count"], 
             pid_photo = (int)items[i]["attachment"]["photo"]["pid"], 
             owner_id = (int)items[i]["attachment"]["photo"]["owner_id"], 
             isLikeMe = Convert.ToBoolean((int)items[i]["likes"]["user_likes"]), 
             uid = (int)items[i]["source_id"], 
             post_id = (int)items[i]["post_id"], 
             author_name = to_auth, 
             image_uri = to_autorname, 
             Date_Time = ((App)Application.Current).ConvertTimestamp(Convert.ToDouble((int)items[i]["date"])).ToString("dd MMM HH:mm:ss"), 
             comm_count = (int)items[i]["comments"]["count"], 
            }; 
            list.Insert(0, item); 
            //list.Add(item); 
            break; 
           case "graffiti": 
            item = new Data { 
             attachment_type = "graffiti", 
             image_src = items[i]["attachment"]["graffiti"]["src"].ToString(), 
             image_src_big = items[i]["attachment"]["graffiti"]["src_big"].ToString(), 
             text = items[i]["text"].ToString().Replace("<br>", "\n").Replace("&quot;", "\""), 
             likes_count = (int)items[i]["likes"]["count"], 
             pid_photo = (int)items[i]["attachment"]["graffiti"]["gid"], 
             owner_id = (int)items[i]["attachment"]["graffiti"]["owner_id"], 
             isLikeMe = Convert.ToBoolean((int)items[i]["likes"]["user_likes"]), 
             uid = (int)items[i]["source_id"], 
             post_id = (int)items[i]["post_id"], 
             author_name = to_auth, 
             image_uri = to_autorname, 
             Date_Time = ((App)Application.Current).ConvertTimestamp(Convert.ToDouble((int)items[i]["date"])).ToString("dd MMM HH:mm:ss"), 
             comm_count = (int)items[i]["comments"]["count"], 
            }; 
            list.Insert(0, item); 
            // list.Add(item); 
            break; 
           case "audio": 
            item = new Data { 
             attachment_type = "audio", 
             audio_text = items[i]["attachment"]["audio"]["performer"].ToString() + " - " + items[i]["attachment"]["audio"]["title"].ToString(), 
             audioUri = "", 
             text = items[i]["text"].ToString().Replace("<br>", "\n").Replace("&quot;", "\""), 
             likes_count = (int)items[i]["likes"]["count"], 
             audioid = (int)items[i]["attachment"]["audio"]["aid"], 
             isLikeMe = Convert.ToBoolean((int)items[i]["likes"]["user_likes"]), 
             uid = (int)items[i]["source_id"], 
             post_id = (int)items[i]["post_id"], 
             author_name = to_auth, 
             image_uri = to_autorname, 
             Date_Time = ((App)Application.Current).ConvertTimestamp(Convert.ToDouble((int)items[i]["date"])).ToString("dd MMM HH:mm:ss"), 
             comm_count = (int)items[i]["comments"]["count"], 
            }; 
            list.Insert(0, item); 
            // list.Add(item); 
            break; 
           case "link": 
            item = new Data { 
             attachment_type = "link", 
             url = items[i]["attachment"]["link"]["url"].ToString(), 
             text = items[i]["text"].ToString().Replace("<br>", "\n").Replace("&quot;", "\""), 
             title = items[i]["attachment"]["link"]["title"].ToString(), 
             likes_count = (int)items[i]["likes"]["count"], 
             isLikeMe = Convert.ToBoolean((int)items[i]["likes"]["user_likes"]), 
             uid = (int)items[i]["source_id"], 
             image_uri = to_autorname, 
             author_name = to_auth, 
             post_id = (int)items[i]["post_id"], 
             Date_Time = ((App)Application.Current).ConvertTimestamp(Convert.ToDouble((int)items[i]["date"])).ToString("dd MMM HH:mm:ss"), 
             comm_count = (int)items[i]["comments"]["count"], 

            }; 
            list.Insert(0, item); 
            // list.Add(item); 
            break; 
           case "note": 
            item = new Data { 
             attachment_type = "note", 
             text = items[i]["text"].ToString().Replace("<br>", "\n").Replace("&quot;", "\""), 
             title = items[i]["attachment"]["note"]["title"].ToString().Replace("&quot;", "\""), 
             image_src = items[i]["attachment"]["link"]["image_src"].ToString(), 
             likes_count = (int)items[i]["likes"]["count"], 
             isLikeMe = Convert.ToBoolean((int)items[i]["likes"]["user_likes"]), 
             noteid = (int)items[i]["attachment"]["note"]["nid"], 
             owner_id = (int)items[i]["attachment"]["note"]["owner_id"], 
             uid = (int)items[i]["uid"], 
             image_uri = to_autorname, 
             author_name = to_auth, 
             post_id = (int)items[i]["post_id"], 
             Date_Time = ((App)Application.Current).ConvertTimestamp(Convert.ToDouble((int)items[i]["date"])).ToString("dd MMM HH:mm:ss"), 
             comm_count = (int)items[i]["comments"]["count"], 
            }; 
            list.Insert(0, item); 
            // list.Add(item); 
            break; 
           case "post": 
            item = new Data { 
             attachment_type = "post", 
             text = items[i]["text"].ToString().Replace("<br>", "\n").Replace("&quot;", "\""), 
             likes_count = (int)items[i]["likes"]["count"], 
             isLikeMe = Convert.ToBoolean((int)items[i]["likes"]["user_likes"]), 
             uid = (int)items[i]["source_id"], 
             image_uri = to_autorname, 
             author_name = to_auth, 
             post_id = (int)items[i]["post_id"], 
             Date_Time = ((App)Application.Current).ConvertTimestamp(Convert.ToDouble((int)items[i]["date"])).ToString("dd MMM HH:mm:ss"), 
             comm_count = (int)items[i]["comments"]["count"], 
            }; 
            list.Insert(0, item); 
            // list.Add(item); 
            break; 
           case "poll": 
            item = new Data { 
             attachment_type = "poll", 
             text = items[i]["text"].ToString().Replace("<br>", "\n").Replace("&quot;", "\""), 
             likes_count = (int)items[i]["likes"]["count"], 
             isLikeMe = Convert.ToBoolean((int)items[i]["likes"]["user_likes"]), 
             uid = (int)items[i]["source_id"], 
             image_uri = to_autorname, 
             author_name = to_auth, 
             poll_question = "Опрос: " + items[i]["attachment"]["poll"]["question"].ToString(), 
             poll_id = (int)items[i]["attachment"]["poll"]["poll_id"], 
             post_id = (int)items[i]["post_id"], 
             Date_Time = ((App)Application.Current).ConvertTimestamp(Convert.ToDouble((int)items[i]["date"])).ToString("dd MMM HH:mm:ss"), 
             comm_count = (int)items[i]["comments"]["count"], 
            }; 
            list.Insert(0, item); 
            // list.Add(item); 
            break; 
           case "video": 
            item = new Data { 
             image_src = items[i]["attachment"]["video"]["image"].ToString(), 
             image_src_big = items[i]["attachment"]["video"]["image_big"].ToString(), 
             text = items[i]["text"].ToString().Replace("<br>", "\n").Replace("&quot;", "\""), 
             likes_count = (int)items[i]["likes"]["count"], 
             pid_photo = (int)items[i]["attachment"]["video"]["vid"], 
             owner_id = (int)items[i]["attachment"]["video"]["owner_id"], 
             attachment_type = "photo", 
             isLikeMe = Convert.ToBoolean((int)items[i]["likes"]["user_likes"]), 
             uid = (int)items[i]["source_id"], 
             image_uri = to_autorname, 
             author_name = to_auth, 
             post_id = (int)items[i]["post_id"], 
             Date_Time = ((App)Application.Current).ConvertTimestamp(Convert.ToDouble((int)items[i]["date"])).ToString("dd MMM HH:mm:ss"), 
             comm_count = (int)items[i]["comments"]["count"], 
            }; 
            list.Insert(0, item); 
            // list.Add(item); 
            break; 
          } 
          #endregion 
         } 

         //this.newslistBox.ItemsSource = null; 

         this.newslistBox.ItemsSource = list; 
         Debug.WriteLine("Itemsspurce updated"); 
        } else { 
         ToastPrompt toast = new ToastPrompt(); 
         //Debug.WriteLine(who.ToString()); 
         // Debug.WriteLine(who.FirstOrDefault()[4].ToString()); 
         toast.TextOrientation = System.Windows.Controls.Orientation.Vertical; 
         toast.Message = "Нету новых новостей"; 
         toast.MillisecondsUntilHidden = 2000; 
         toast.Show(); 
        } 

        ProgBar.IsIndeterminate = false; 
        ProgBar.Visibility = Visibility.Collapsed; 

       }... 
+0

如果您的应用程序停止响应,那么它的线程问题。没有代码的视频就没用了。 –

+0

如果您将列表框绑定到线程正在修改的数据源。那么这可能是列表框无响应的原因。 –

+1

让我们看看一些代码。 –

回答

1

从快看看你的代码有几件事情:

  • 不要使用WebClient,因为它返回的UI线程这可能是您的UI挂问题的原因上。请使用HttpWebRequest请注意,这种行为在芒果变化

  • NetworkInterface.GetIsNetworkAvailable()可能会很慢。您是否真的需要在收到网络请求的回复时调用它。

  • 查看使用BackgroundWorker而不是创建没有间隔的DispatcherTimer

  • 因为您的请求都是在同一个网站,可能不会被合并(包裹?)成一个请求?

  • 可能是主要的问题:你总是更换什么已经从服务器返回无论它是否已经改变或不在名单。如果存在并且服务器返回的数据发生更改,您可能需要更新该集合。

  • 如果共享代码以演示问题,请尝试并仅包含重新创建问题所需的最小程度。

  • 赋予变量有意义的名称。它可以帮助其他人更容易地阅读(并希望理解)你的代码。

  • Seriousy,一种240+线条法?!?这不是创建可维护代码的好方法。

+0

谢谢! 我有一个来自服务器的非常困难的回应,并需要为每个项目创建模板作为回应。你帮我 – SevenDays