I have a ListBox with ~40-150 items. When I click the Update button, my app checks for new news and messages on a background thread. If there are message or news updates, the app shows the notification. Even if there are no new news or message items, my listbox refreshes and still does not respond for 1-10 seconds. How can I disable the update in this case? My code is clear and this threads works in a background. I also have video of the problem.
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(""", "\""),
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(""", "\""),
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(""", "\""),
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(""", "\""),
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(""", "\""),
title = items[i]["attachment"]["note"]["title"].ToString().Replace(""", "\""),
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(""", "\""),
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(""", "\""),
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(""", "\""),
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;
}...
A few things from a quick look at your code:
Don't use
WebClient
, as it returns on the UI thread which is probably the cause of your UI hanging issue. Instead useHttpWebRequest
. Note that this behaviour changes in MangoNetworkInterface.GetIsNetworkAvailable()
can be slow. Do you really need to call it when you've got your response from the web request.Look at using a
BackgroundWorker
rather than creating aDispatcherTimer
with no interval.In that your requests are all to the same site, could htey not be combined (wrapped?) into a single request?
Probably the main issue: you are always replacing the list with what has been returned from the server regardless of whether it has changed or not. You probably want to update the collection if it exists and there are changes with the data returned from the server.
If sharing code to demonstrate a problem try and only include the minimum needed to recreate the issue.
Give variables meaningful names. It helps other people read (and hopefully understand) your code more easily.
Seriousy, a 240+ line method?!? That's not a good way to create maintainable code.
精彩评论