Randy Crockett Ответов: 1

Приложение Windows "(не отвечает)", но в конечном итоге завершает работу


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


Я заполняю список, поэтому я заставляю ListBox.Refresh() каждые 2000 строк во время чтения. Это прекрасно работает, пока мое приложение имеет фокус, но для больших файлов мои пользователи будут делать на компьютере другие вещи, которые отвлекают внимание от приложения.


Как я могу заставить Windows продолжать обновлять приложение в фоновом режиме?
Вот основной код чтения...ничего особенного:

this.Cursor = Cursors.WaitCursor;
    lbOriginalFile.Items.Clear();
    string strStreamLine = "";
    int nPosition = 0;
    int nLineCount = 0;
    if (System.IO.File.Exists(GCodeFilePath) == true)
    {

        using (System.IO.StreamReader sr = new System.IO.StreamReader(GCodeFilePath))
        {
            strStreamLine = sr.ReadLine();
            while (strStreamLine != null)
            {
                nLineCount++;
                lbOriginalFile.Items.Add(strStreamLine);
                lblCount.Text = nLineCount.ToString();
                lbOriginalFile.Refresh();
                lblCount.Refresh();
                strStreamLine = sr.ReadLine();
            }
            nListBoxArray[nPosition] = nPosition;
        }
    }
    this.Cursor = Cursors.Default;


Что я уже пробовал:

Приведенный выше код показывает попытку обновить счетчик и обновить элементы управления.

1 Ответов

Рейтинг:
1

Dave Kreskowiak

Проблема не будет решена с помощью "принудительного обновления Windows" вашего приложения.

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

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

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

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

Google: "C# backgroundworker"[^]