2011-01-05 5 views
0

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

 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);    
    } 
+0

Является ли это WPF или WinForms? Также вы можете подтвердить, что PopulationListView() фактически вызывается во время выполнения? –

+0

@Greg Это WinForms - SuspendLayout \ ResumeLayout. –

+0

Правильно, его в WinForms –

ответ

1

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

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

+0

Я перестал обращаться к методу ReportProgress так часто и добавил Thread.Sleep (50) и исправил его. Спасибо! –

0

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

Посмотрите на

Control.InvokeRequired Property

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

и Control.BeginInvoke Method (Delegate)

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

Смежные вопросы