После обновления до 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 в ожидании ответа.