public int read(byte[] buf, int off, int cnt) throws IOException {try {beginRead();return super.read(buf, off, cnt);} catch (InterruptedIOException e) {throw readTimedOut(e);} finally {endRead();}}
public override int Read(byte[] buf, int off, int cnt){try{BeginRead();return base.Read(buf, off, cnt);}catch (ThreadInterruptedException){throw ReadTimedOut();}finally{EndRead();}}