First of all, your code, guys, is great written.
The second thing is: when calling FtpClient.Dir(), System.IO.IOException thrown sometimes from FTPControlSocket.ReadReply on reader.ReadLine().
Didn't check it with other calls.
For naive me it seems to happen when line not yet ready in the stream: I'm requesting VERY remote ftp site.
IMHO, a simple reading loop with 10 milliseconds sleep will solve the problem.