The recommended and most reliable way is to wait until the current method (be it sync or async) finishes and only when it has finished then call another method. So when you start an operation and you have another request when the operation is still in progress, just put the new requests into some queue and only continue executing the new requests after the original operation has ended.
If you want to call more methods at once, it is possible to set Ftp.Settings.EnableMultipleBlockingCalls to 'true'.
please note that this is really unrecommended as it will be very inefficient.
Ftp.State is property is a relict from the times when there was no log in the Ftp class. This property returns the state on the level of FTP protocol, not on the FTP component level! So ftp.State can change multiple times within one call of a Ftp class method. So definitely do not use the Ftp.State as it is planned to be deprecated soon.