I'd still like to understand what's going on - but I've worked around it in a slightly more processor intensive way.
Instead of blocking on the read, I did the following.......
void ReadSomeBytes(array<unsigned char>^ buffer, UInt16 offset, UInt16 count)
{
while ((MG::thcData.thcSerial->BytesToRead < count))
{
// Kill the thread if requested.
if (MG::thcControl.hariKari)
ExitThread(0);
// Didn't get killed, so sleep a little
Sleep(5);
}
// Read the bytes.
MG::thcData.thcSerial->Read(buffer, offset, count);
}
("hariKari" is a boolean flag that the plug-in uses to signal the serial input processing thread to gracefully shut down.)