除非我在退出之前插入睡眠,否则System.Net.FtpClient openwrite不会上传文件

use*_*458 6 c# ftps

我正在使用System.Net.FtpClient程序集将文件上载到测试FTP站点.当我运行下面的代码时,文件不会出现在远程位置,除非我使用Thread.Sleep如下所示(我不想使用):

using System;
using System.IO;
using System.Net;
using System.Net.FtpClient;
using System.Security.Cryptography.X509Certificates;
using System.Threading;

namespace FtpsUploadTest
{
    /// <summary>
    /// The ftp publisher.
    /// </summary>
    public class FtpPublisher
    {
        private readonly FtpsSettings _settings;
        private readonly IFtpClient _ftpClient;

        /// <summary>
        /// Initializes a new instance of the <see cref="FtpPublisher"/> class.
        /// </summary>
        public FtpPublisher()
        {
            _ftpClient = new FtpClient();
            _settings = SettingsReader.GetMySettings();
            Init();
        }


        /// <summary>
        /// The publish.
        /// </summary>
        /// <param name="fileToUpload">
        /// The input file path.
        /// </param>
        public void Publish(string fileToUpload)
        {
            var remoteFileName = Path.GetFileName(fileToUpload);

            Console.WriteLine("FTPS host: {0} remote path: {1}", _settings.FtpsRemoteHost, _settings.FtpsRemotePath);

            if (!_ftpClient.IsConnected)
            {
                _ftpClient.Connect();
            }

            var fullRemotePath = string.Format("{0}/{1}", _settings.FtpsRemotePath, remoteFileName);

            using (var ftpStream = _ftpClient.OpenWrite(fullRemotePath))
            using (var inputStream = new FileStream(fileToUpload, FileMode.Open))
            {
                inputStream.CopyTo(ftpStream);
                Thread.Sleep(5000);  // <------------------- DOESNT WORK IF REMOVE THIS SLEEP!!
            }

            Console.WriteLine("File '{0}' published successfully", fileToUpload);
        }


        private void Init()
        {
            _ftpClient.Host = _settings.FtpsRemoteHost;
            _ftpClient.Port = _settings.FtpsRemotePort;
            _ftpClient.DataConnectionConnectTimeout = 60000;
            _ftpClient.ConnectTimeout = 60000;
            _ftpClient.Credentials = new NetworkCredential(_settings.FtpsUserId, string.Empty);
            _ftpClient.DataConnectionType = 0;

            if (string.IsNullOrEmpty(_settings.CertFile) || string.IsNullOrEmpty(_settings.CertPassword))
            {
                return;
            }

            _ftpClient.ClientCertificates.Add(CreateCertificate(_settings.CertFile, _settings.CertPassword));
            _ftpClient.EncryptionMode = (FtpEncryptionMode)2;
            _ftpClient.DataConnectionEncryption = true;
        }


        private X509Certificate CreateCertificate(string certFile, string certPassword)
        {
            return new X509Certificate(certFile, certPassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

任何人都知道如何在不使用Thread.Sleep的情况下让它工作?我试过冲洗,关闭流,但这没有帮助.

Bra*_*ner 4

远程 FTP 服务器的操作与您的代码完全异步。根据服务器的配置,它可能会在使文件可用之前执行扫描病毒或其他簿记等操作。除非您可以直接控制 FTP 服务器,否则您对此无能为力。即使如此,它可能需要一些相当深入的配置更改,甚至不同的软件包。

可能对您有用的一件事是在完成上传后“轮询”文件。创建一个循环来检查文件,等待 1 秒,然后重复,直到找到文件或放弃。如果出现问题,异步/等待模式或来自不同线程的回调可以帮助您消除任何 UI 冻结。