Это приводит к утечке памяти из-за постоянно увеличивающегося ...
Просто потому, что вы бесконечно зацикливаете BeginRead
операций до того, как существующая завершена с помощью:
while (true)
{
read(); // <-- this delegate calls `BeginRead` thus starting ANOTHER verlapped read operation
//Thread.Sleep(100);
}
Измените его на что-то вроде:
serialPort.Open();
read(); // kick off initial read
while (/* some condition*/)
{
}
// quit
Ваш обратный вызов делает правильную вещь, гарантируя, что другая операция чтения с перекрытием начинается только после завершения предыдущего:
AsyncCallback callback = delegate (IAsyncResult ar)
{
int len = serialPort.BaseStream.EndRead(ar);
// do something with data
read(); // <--- correctly initiates another read since the existing is complete
};