Как сделать обновление списка в режиме реального времени в C # - PullRequest
0 голосов
/ 05 января 2011

У меня есть приложение, которое сканирует сеть в поисках фильмов, их названий, продолжительности и времени последнего обращения. Поскольку в сети много компьютеров, это может занять некоторое время, и я бы хотел обновить свой просмотр списка в режиме реального времени. Вот то, что у меня есть, но оно совсем не работает.

        private void PopulateListView()
    {
        this.listView1.SuspendLayout();

        listView1.Items.Clear(); 

        // go thru list of movies to add
        foreach (string movie in listviewMovieList)
        {
            ListViewItem item1 = new ListViewItem(movie);
            listView1.Items.AddRange(new ListViewItem[] { item1 });

        }
        this.listView1.ResumeLayout();            
    }

Это вызывается моими фоновыми работниками. Метод ProgressChanged:

        private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        string movie = (string)e.UserState;            

        if (movie != null)
        {
            listviewMovieList.Add(movie);
            PopulateListView();

        }

        this.progressBar1.Increment(e.ProgressPercentage);            
    }

Ответы [ 2 ]

1 голос
/ 05 января 2011

Проблема в том, что это недостаточно медленно.Вы слишком часто вызываете ReportProgress ().Это зависит от того, сколько работы выполняет поток пользовательского интерфейса, но делайте это примерно несколько сотен раз в секунду, и поток пользовательского интерфейса замирает, не имея возможности выполнять свои обычные обязанности.Как рисовать вид списка.Ваш код очень дорогой, для очистки и повторного заполнения ListView требуется много сообщений Windows.

По крайней мере, не делайте это для одного фильма за раз, соберите его и используйте AddRange() метод.Один звонок на 50 мсек идеален, человек не может читать быстрее, чем это в любом случае.Замедлите рабочий поток, используя Invoke () вместо BeginInvoke ().ListView.VirtualMode может помочь.

0 голосов
/ 05 января 2011

Я думаю, что проблема может заключаться в перекрестных вызовах элементов управления WinForm.

Взгляните на

Свойство Control.InvokeRequired

Получает значение, указывающее, должен ли вызывающий объект вызывать метод invoke при вызове метода для элемента управления, поскольку вызывающий объект находится в потоке, отличном от того, в котором создан элемент управления.

и Метод Control.BeginInvoke (Делегат)

Выполняет указанный делегат асинхронно в потоке, в котором был создан базовый дескриптор элемента управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...