1

我正在使用最新的 FluentFTP,并且正在尝试实现并行上传功能。

问题是某些连接会引发异常并显示消息“无法创建套接字”,并且我在失败的文件上看不到任何特定模式。

private List<string> ParallelUpload(string dir, string ftpPath, int maxConnections, FtpRemoteExists existsMode, FtpVerify verifyOptions) {

    Dictionary<string, byte[]> imgList = ReadImagesFromDisk(dir);
    var fileList = imgList.Keys.ToList();
    var failedUploads = new List<string>();
    var syncFailed = new object();
        
    fileList.ParallelForEarch(maxConnections, (fileName) => {
        var tmpFailed = DoUploadImage(ftpPath, fileName, existsMode, verifyOptions);
        lock (syncFailed) {
            failedUploads.AddRange(tmpFailed);
        }
    });
        
    return failedUploads;
}
        
private List<string> DoUploadImage(string ftpPath, string file, FtpRemoteExists existsMode, FtpVerify verifyOptions) {
        
    var failedUploads = new List<string>();
        
    using (var ftp = new FtpClient()) {
        ftp.Host = _ftpServer;
        ftp.Port = _ftpPort;
        
        if (!string.IsNullOrEmpty(_ftpUser) && !string.IsNullOrEmpty(_ftpPassword))
            ftp.Credentials = new NetworkCredential(_ftpUser, _ftpPassword);
        
        ftp.EncryptionMode = FtpEncryptionMode.Auto;
        ftp.ValidateAnyCertificate = true;
        
        ftp.OnLogEvent = OnFTPLogEvent;
        
        ftp.AutoConnect();
        
        var remotePath = $"{ftpPath}{Path.GetFileName(file)}";
        
        try {
            ftpStatus = ftp.UploadFile(file, remotePath, existsMode, createRemoteDir, verifyOptions);
        } catch (Exception ex) {
            //catch exception
        }
        
        if (ftpStatus.IsFailure())
            failedUploads.Add(file);
    }
        
    return failedUploads;
}

public void ParallelForEarch<TSource>(this IEnumerable<TSource> source, int parallelSlots, Action<TSource> action) {
    Parallel.ForEach(source, new ParallelOptions() { MaxDegreeOfParallelism = parallelSlots }, action);
}

4

0 回答 0