2011-07-20 10 views
0

私は〜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

あなたのコードで簡単に見からいくつかのこと:それはおそらくあなたのUIの吊り問題の原因であるUIスレッド上で返すよう

  • は、WebClientを使用しないでください。代わりにHttpWebRequestを使用してください。 この動作がマンゴーで変更されることに注意してください。

  • NetworkInterface.GetIsNetworkAvailable()が遅くなる可能性があります。あなたは本当にあなたがWebリクエストからあなたの応答を持っているときにそれを呼び出す必要がありますか?

  • を参照すると、間隔を空けずにDispatcherTimerが作成されます。

  • あなたのリクエストはすべて同じサイトにありますが、1つのリクエストに結合(ラップされていません)できないのでしょうか?

  • おそらく主な問題:あなたは関係なく、常にそれが変更されたかどうかのか、サーバーから返されたものとリストを交換します。コレクションが存在し、サーバーから返されたデータに変更がある場合は、コレクションを更新することをお勧めします。

  • 問題を示すコードを共有する場合は、問題を再現するのに必要な最小限のものだけを含めるようにしてください。

  • 変数に意味のある名前を付けます。他の人があなたのコードをより簡単に(そしてうまく理解できるように)助けます。

  • 240+ラインメソッドは、保守可能なコードを作成するのは良い方法ではありません。

+0

ありがとう! 私はサーバーからの応答が非常に難しく、応答の各項目のテンプレートを作成する必要があります。あなたは私を助けました – SevenDays

関連する問題