自从更新到Windows 10 1809之后,我的应用程序似乎正在WinForms C ++ / CLI TextBox.Text设置调用上泄漏内存。
文本框是从记录蓝牙通信的单独设备线程更新的日志。经过一段随机的时间(有时10分钟,有时是几个小时)后,GUI事件处理程序将锁定TextBox。文本集调用和WorkingSet内存将线性增加(〜10MB / s)约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机器上复制,这可能是偶然的,但似乎不太可能。
有问题的机器规格相对较低,运行带有Celeron 1.6GHz处理器的2GB RAM,但是应用程序非常薄,在满载情况下通常仅使用50MB的WorkingSet内存。
它泄漏内存的速率似乎取决于锁定时文本框的内容。
更新
在任何Windows 1809计算机上似乎都是TextBox.MultiLine的问题。可以通过使用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上引发了问题。