我有一个listview,我从webservice查询填充。问题是,如果http查询因网络速度慢或URL错误,那么查询会冻结UI一点。所以我的问题是如何将其抛给一个副流程并在后台填充列表?
以下是我获取数据的方式,并且它通常在request.GetResponse()时保持30秒或更长时间。我得到了JSON并解析了这个,但是这个函数是保持,并希望将它包装在某些东西中。那我该怎么做呢?
public static String get(String url) {
StringBuilder sb = new StringBuilder();
// used on each read operation
byte[] buf = new byte[32768];
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.Timeout = 10000;
HttpWebResponse response;
try {
response = (HttpWebResponse)request.GetResponse();
} catch (WebException we) {
return "ERROR!"
}
Stream resStream = response.GetResponseStream();
... read from stream and parse
}
####使用Worker Thread ############的建议
这也不起作用。
// create new thread
new Thread(new ThreadStart(myTable) ).Start();
在myTable方法中使用匿名委托,我认为可能是最好的方式。
private void myTable() {
if (this.InvokeRequired) {
this.Invoke(new EventHandler(delegate(object obj, EventArgs a) {
// do work here
String url = "http://someurl....";
// Set the view to show details.
listView1.View = View.Details;
// Display check boxes.
listView1.CheckBoxes = false;
// Select the item and subitems when selection is made.
listView1.FullRowSelect = true;
listView1.Items.Clear();
listView1.Columns.Clear();
listView1.Columns.Add(Resources.MainColumn0, 20, HorizontalAlignment.Left);
listView1.Columns.Add(Resources.MainColumn1a, 250, HorizontalAlignment.Left);
listView1.Columns.Add(Resources.MainColumn2, 150, HorizontalAlignment.Left);
try {
// Call the function mentioned above to get the data from the webservices....
string users = get(urlUsers);
.............
答案 0 :(得分:1)
使用工作线程进行查询,使用Control.Invoke更新UI或使用异步调用从服务获取数据。如果你不确切知道如何获取数据和进行人口统计,那就是我能得到的详细信息。
修改强>
您调用Invoke会破坏您将工作卸载到线程的尝试,这会将所有内容移回UI线程。你需要按照这些方针做点什么:
private void MyThreadProc()
{
// get the data from the web service here
this.Invoke(new EventHandler(delegate
{
// update your ListView here
}));
}
请注意,该命令的长时间运行部分在Invoke调用中包含 not 。