Basically I think block 2 is better because you get an asynchronous notification if there is data available. As long as you dont call the "close" method for the comport, it will receive the data.
Furthermore I suggest (regarding the event topic) to make two seperated methods like:
public void OpenPort()
{
this.sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
this.sp.Open();
}
public void ClosePort()
{
this.sp.Close();
this.sp.DataReceived -= new SerialDataReceivedEventHandler(sp_DataReceived);
}
The second method is very important to deregister the event. For example if you close your application. Otherwise your application will hang. Always deregister events if you registered to them, because also the event handler is stopping the Garbage Collection from cleaning up your objects.