Утечка памяти TextBox.Text установлена ​​в Windows 10 1809 (10.0.17763) - PullRequest
0 голосов
/ 04 декабря 2018

После обновления до Windows 10 1809 мое приложение, похоже, теряет память при вызове набора WinForms C ++ / CLI TextBox.Text.

Текстовое поле - это журнал, обновляемый из отдельного потока устройства, регистрирующего сообщения Bluetooth.Через произвольный промежуток времени (иногда 10 минут, иногда несколько часов) обработчик событий GUI блокирует вызов набора TextBox.Text, и память WorkingSet будет линейно увеличиваться (~ 10 МБ / с) в течение от 30 секунд до минуты перед восстановлением.Однако выделенная память фиксации сохраняется и затем создается в следующий раз, когда происходит сбой.Это происходит до тех пор, пока приложение в конечном итоге не завершится с переполнением стека или исключением из памяти.

Это кости обработчика событий Comms:

System::Void MainForm::OnCommsMessageLog(System::Object^ sender, CustomEventArgs::LogMessageEventArgs^ plogMessageEventArgs)
{
    if (InvokeRequired)
    {
        Invoke(gcnew commsMessageDelegate(this, &MainForm::OnCommsMessageLog), sender, plogMessageEventArgs);
    }
    else
    {
        msclr::lock OnCommsMessageLogLock(mpOnCommsLogLock);

        String^ logMessage = plogMessageEventArgs->LogMessage;

        // Pipe out to file to check for log contents
        StreamWriter^ pWriter = gcnew StreamWriter(mLogFilePath + pBthDevice->Name + ".txt", true);
        pWriter->Write(logMessage);
        pWriter->Close();

        mpDeviceLog += logMessage; // Add new log line to String member variable

        if(mpDeviceLog->Length > MAX_LOG_LENGTH) // MAX_LOG_LENGTH = 100000
        {
            mpDeviceLog = mpDeviceLog->Substring(MAX_LOG_LENGTH / 5);
            logTextBox->Text = mpDeviceLog; // <-- LOCKS HERE
        }
        else
        {
            logTextBox->AppendText(logMessage);
            //logTextBox->Text += logMessage; // <-- ALTERNATIVELY LOCKS HERE IF THIS METHOD IS USED
        }
    }
}

Это не может быть реплицировано ни на одинМашина 1809 года, которая может быть случайной, но кажется маловероятной.

Рассматриваемые машины имеют относительно низкую спецификацию, работают с 2 ГБ ОЗУ с процессором Celeron 1.6 ГГц, но приложение довольно тонкое и обычно только при полной нагрузкеиспользует 50 МБ памяти WorkingSet.

Скорость утечки памяти зависит от содержимого текстового поля во время блокировки.


Обновление

Кажется, проблема с TextBox.MultiLine на любом компьютере с Windows 1809.Можно реплицировать, создав небольшое приложение с текстовым полем MultiLine, затем запустив следующий код:

        logTextBox.Text = "a\r\n";
        logTextBox.Text = "a\r"; // Will lock here for 30 to 60s

Проблема может быть устранена путем добавления следующего между операциями набора текста:

        logTextBox.Clear();
        logTextBox.Multiline = false;
        logTextBox.Multiline = true;

Проблема также возникла на MSDN в ожидании ответа.

...