Hello Steve,
- It looks like you are running your application on .NET Compact Framework, which we have not realized before. Which version of .NET CF do you use? Please try using the latest release (2018 R2) and let us know whether it still behaves the same.
- From the logs, it looks like Rebex FTP/SSL gets stuck inside the Upload method because the "finally" block in FtpWorkerThread never logs the "FtpDisconnect" message. This would explain why the Ftp object is stuck in "Reading" state. It's unclear whether this is a bug in Rebex FTP/SSL or in .NET Compact Framework, but calling ftp.Dispose() method from the foreground thread might be able to "unstuck" it, making FtpWorkerThread throw an exception.
- In FtpWorkerThread method, you only catch FtpException, but not any other kind. Adding "catch Exception" is recommended to make sure there are no unhandled exceptions.