2015-09-14 2 views
0

У меня очень простой код в программе VB.NET для загрузки всех путей в папку в текстовое поле. Код отлично работает, проблема в том, что он добавляет строки в реальном времени, поэтому загрузка 20-килобайтовых файлов занимает около 3 минут, а интерфейс отображается по строкам.Избегайте обновления текстового поля в режиме реального времени в vb.net

Это мой код:

Dim ImageryDB As String() = IO.Directory.GetFiles("c:\myimages\") 

    For Each image In ImageryDB 
     txtbAllimg.AppendText(image & vbCrLf) 
    Next 

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

Заранее благодарен

+0

Это полностью самозанятая проблема. В мире нет пользователя, который считает, что текстовое поле полезно. Никто не любит смотреть на безумно прокручивающееся окно, имея возможность читать 20 000 строк текста или когда-либо рассматривать его редактирование. Так что просто избавитесь от текстового поля. Вместо этого используйте ярлык, обновляя его один раз каждые 100 мс достаточно хорошо. Используйте [этот] (http://stackoverflow.com/a/2397968/17034). –

+0

В этом случае список не является вариантом из-за других инструментов, используемых с этим приложением. Это не предназначено для людей читать 20000 строк, но обрабатывать их потом ... – daviddgz

+0

Этикетка, а не ListBox. Используйте StringBuilder, чтобы «обрабатывать их потом». –

ответ

0

Да, вы можете это сделать. Вам нужно будет загрузить имена файлов в нестандартную структуру данных, а не загружать их непосредственно в элемент управления. Затем вы можете периодически обновлять элемент управления, чтобы отображать все, что загружено до сих пор. Тем не менее, я думаю, вы обнаружите, что медленность приходит только от обновления управления. Как только вы удалите эту часть, не будет необходимости периодически обновлять элемент управления во время процесса загрузки, так как он будет почти мгновенным.

Вы можете просто загрузить все имена файлов в строку, а затем установить только текстовое поле этой строки после того, как он был полностью загружен, например:

Dim imagePaths As String = "" 
For Each image As String In Directory.GetFiles("c:\myimages\") 
    imagePaths &= image & Environment.NewLine 
Next 
txtbAllimg.Text = imagePaths 

Однако, это не так эффективно, как использование StringBuilder:

Dim imagePaths As New StringBuilder() 
For Each image As String In Directory.GetFiles("c:\myimages\") 
    imagePaths.AppendLine(image) 
Next 
txtbAllimg.Text = imagePaths.ToString() 

Однако, так как метод GetFiles уже возвращая полный список путей к вам как массив строк, было бы еще удобнее (и, вероятно, даже более эффективно) просто использовать String.Join способ объединить все элементы в массиве в одну строку:

txtbAllimg.Text = String.Join(Environment.NewLine, Directory.GetFiles("c:\myimages\")) 
+0

Большое спасибо Стив за помощь! Первый вариант занял 14 секунд, второй и третий только 3, чтобы загрузить 20k-пути в txtbox! Это именно то, что я искал, ты мастер! Я хорошо разбираюсь в кодах и принимая во внимание будущее, я не знал о Stringbuilder. – daviddgz

0

Я знаю, что это не ответ на актуальный вопрос, но AppendText медленно. Использование ListBox и Добавление элементов к нему составляет ок. В 3 раза быстрее. ListBox также имеет преимущество быть в состоянии выбрать элемент легко (по крайней мере, более легко, чем TextBox)

For each image in ImageryDB 
    Me.ListBox1.Items.add (image) 
Next 

Однако, есть, вероятно, еще более полезным и быстрый способ сделать это. Использование FileInfo.

Dim dir As New IO.DirectoryInfo("C:\myImages") 
Dim fileInfoArray As IO.FileInfo() = dir.GetFiles() 
Dim fileInfo As IO.FileInfo 

For Each fileInfo In fileInfoArray 
    Me.ListBox2.Items.Add(fileInfo.Name) 
Next 
+0

Спасибо, но я не могу использовать список, потому что много последствий для других частей программного обеспечения. – daviddgz

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