Заполните ListView с помощью запроса веб-службы URL - PullRequest
0 голосов
/ 08 сентября 2011

У меня есть список, который я заполняю из запроса веб-сервиса.Проблема заключается в том, что если http-запрос медленный из-за сети или неправильный URL-адрес, запрос на некоторое время останавливает интерфейс пользователя.Итак, мой вопрос: как мне скинуть это на сторонний процесс и заполнить список в фоновом режиме?

Вот как я получаю данные, и они обычно хранятся в течение 30 секунд или более по запросу. GetResponse ();Я возвращаю 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 

}
#### Использование предложения рабочего потока ############

Это тоже не работает.

// 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 Ответ

1 голос
/ 08 сентября 2011

Используйте рабочий поток для выполнения запроса, используйте Control.Invoke для обновления пользовательского интерфейса или используйте асинхронный вызов для получения данных из службы. Не зная больше о том, как именно вы получаете данные и пополняете их, это настолько подробно, насколько я могу получить.

EDIT

Ваша попытка разгрузить работу в поток подрывается вашим вызовом Invoke, который перемещает все обратно в поток пользовательского интерфейса. Вам нужно сделать что-то вроде этого:

private void MyThreadProc()
{
    // get the data from the web service here

    this.Invoke(new EventHandler(delegate
    {
        // update your ListView here
    }));
}

Обратите внимание, что длительная часть команды не содержится в вызове Invoke.

...