C# - Загрузка большого файла в WPF RichTextBox?

Вы сделали бы это так же, как в Java:

function Metrics(params) {
    this.statsd = new StatssD();
}

Единственное отличие состоит в том, что вам не нужно объявлять атрибут с его типом - просто инициализируйте свойство в конструкторе. достаточно.

6
задан 7 May 2009 в 21:15
поделиться

5 ответов

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

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

2
ответ дан 16 December 2019 в 21:45
поделиться

Думали ли вы о попытке сделать приложение многопоточным?

Какую часть текстового файла вам нужно видеть сразу? Вы можете изучить ленивую загрузку в .NET или, в вашем случае, на C #

-1
ответ дан 16 December 2019 в 21:45
поделиться

Почему бы вам не добавить к строковой переменной (или, возможно, даже использовать StringBuilder), а затем присвоить значение свойству .Text, когда вы закончили синтаксический анализ?

1
ответ дан 16 December 2019 в 21:45
поделиться

Я заметил, что при использовании RichTextboxes, когда вы добавляете больше «строк», он начинает замедляться. Если вы можете сделать это, не добавляя '\ n', это ускорится для вас. Помните, что каждый '\ n' - это новый объектный блок абзаца для RichTextbox.

Это мой метод загрузки файла размером 10 МБ. Загрузка занимает около 30 секунд. Я использую диалоговое окно с индикатором выполнения, чтобы сообщить пользователю, что загрузка займет некоторое время.

// Get Stream of the file
fileReader = new StreamReader(File.Open(this.FileName, FileMode.Open));

FileInfo fileInfo = new FileInfo(this.FileName);

long bytesRead = 0;

// Change the 75 for performance.  Find a number that suits your application best
int bufferLength = 1024 * 75;

while (!fileReader.EndOfStream)
{
    double completePercent = ((double)bytesRead / (double)fileInfo.Length);

    // I am using my own Progress Bar Dialog I left in here to show an example
    this.ProgressBar.UpdateProgressBar(completePercent);

    int readLength = bufferLength;

    if ((fileInfo.Length - bytesRead) < readLength)
    {
        // There is less in the file than the lenght I am going to read so change it to the 
        // smaller value
        readLength = (int)(fileInfo.Length - bytesRead);
    }

    char[] buffer = new char[readLength];

    // GEt the next chunk of the file
    bytesRead += (long)(fileReader.Read(buffer, 0, readLength));

    // This will help the file load much faster
    string currentLine = new string(buffer).Replace("\n", string.Empty);

    // Load in background
    this.Dispatcher.BeginInvoke(new Action(() =>
        {
            TextRange range = new TextRange(textBox.Document.ContentEnd, textBox.Document.ContentEnd);
            range.Text = currentLine;

        }), DispatcherPriority.Normal);
}
2
ответ дан 16 December 2019 в 21:45
поделиться

Я работаю над очень похожим проектом.

Проект влечет за собой загрузку большого текстового файла (максимальный размер примерно 120 МБ, но мы хотим увеличить) и последующее построение структуры текстового файла в виде дерева. При щелчке по узлу в дереве пользователь переходит к этой части текстового файла.

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

Итак ... скажем, загрузите весь файл в список, но поместите только 100 из этих строк в rtb.Text. Если пользователь прокручивает вверх, удалите нижнюю строку и добавьте строку текста вверху. Если они прокручиваются вниз, удалите верхнюю строку и добавьте строку текста внизу. Я получаю довольно хорошую производительность с этим решением. (50 секунд для загрузки файла размером 120 МБ)

2
ответ дан 16 December 2019 в 21:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: