public async Task DownloadDirectory(
            string remotedirectory,
            Func <string, IFileStream> onCreateFileStream,
            Action <string> onCreateDicectroy)
        {
reset:
            this._filesQueue.Clear();
            TransferTaskFlage = TransferTaskFlage.Allow;
            var result = await this.AwaitGetDirectoryFiles(remotedirectory);

            if (!result)
            {
                var isReset = await this.AwaitResetDownloadDirectory();

                if (isReset)
                {
                    goto reset;
                }
                else
                {
                    return;
                }
            }

            while (true)
            {
                if (_filesQueue.Count <= 0)
                {
                    break;//文件夹所有文件传输完成
                }
                if (TransferTaskFlage == TransferTaskFlage.Abort)
                {
                    break;//停止任务
                }
                var file = _filesQueue.Dequeue();
                if (file.Type == DirectoryFileType.File)
                {
                    var targetFileName = file.FileName;
                    var localFileName  = file.FileName.Substring(remotedirectory.LastIndexOf("\\") + 1);
                    var fileStream     = onCreateFileStream?.Invoke(localFileName);
                    if (fileStream.IsNull())
                    {
                        continue;
                    }
                    if (_transferMode == TransferMode.Cancel || TransferTaskFlage == TransferTaskFlage.Abort)
                    {
                        break;
                    }
                    await this.DownloadFile(fileStream, targetFileName);
                }
                else
                {
                    var directory = file.FileName.Substring(remotedirectory.LastIndexOf("\\") + 1);
                    onCreateDicectroy?.Invoke(directory);
                }
            }
            this._filesQueue.Clear();
        }
 /// <summary>
 /// 停止所有的传输任务
 /// </summary>
 public void StopTransferTask()
 {
     this.TransferTaskFlage = TransferTaskFlage.Abort;
 }