使用URL webservice查询填充ListView

时间:2011-09-08 18:21:10

标签: c# listview windows-mobile compact-framework

我有一个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);
 .............

1 个答案:

答案 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