It's a bug in Npgsql. I just verified it. It was fixed on 03/10/2013, but there hasn't been a stable release since then. As it currently stands you'll have to build from current sources to get around this.
It is caused by a combination of the fact that Socket.Poll() takes an Int32 microseconds argument, and by what appears to be a bug in Socket.Poll() itself.
First, 2 hours converts to -1,389,934,592 microseconds (7200 seconds * 1,000,000), the absolute value of which is about 48 minutes.
Second, the Socket.Poll() documentation states:
set the microSeconds parameter to a negative integer if you would like to wait indefinitely for a response.
Instead, it appears to convert to the absolute value, about 48 minutes, so there's your odd but predictable timeout.