It looks like you are doing the operation from within the main thread and therefore blocking the application messageloop. This would also mean that if the operation takes to long, you would get the message that the program isn't responding anymore. A solution is to implement some threading or simply process the events like this:
replace this:
psftp.WaitForExit();
with something like this:
while (!psftp.WaitForExit(100))
{
Application.DoEvents();
}
now every 100 milliseconds the events are handled which means that the invoked event can be executed.
Good luck!