我正在使用最新的 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);
}