I know that's been covered by Jon Skeet in here Multi-threading in .NET: Introduction and suggestions
The general gist, I would have thought was something like this,
SerialPort _serialPort = ...
Thread thread = new Thread(() => ReadData(_serialPort, buffer));
public void ReadData(SerialPort _serialPort, byte buffer)
_serialPort.Read(buffer, 0, 20);
although I think the passing/handling of the buffer may require more thought/attention than I've paid to it