共计 2299 个字符,预计需要花费 6 分钟才能阅读完成。
上传性能
首先退出默认的配置项(这部分有对应的办法进行设置):
异步上传的局部代码
/// <summary>
/// 异步上传 (多个文件最好用这个办法) 多线程时设置最大连接数 能够保障按队列先入先进来传输 此时不须要设置线程池中线程数量
/// </summary>
/// <param name="fullName"></param>
/// <param name="fileName"> 如果为空 默认取上传文件的名称 </param>
/// <param name="process"></param>
public void AsynUpload(string fullName,string fileName, Func<FtpState, FtpState> process)
{
ManualResetEvent waitObject;
FtpState state = new FtpState();
try
{string _port = string.IsNullOrEmpty(port) ? "": $":{port}";
fileName = string.IsNullOrEmpty(fileName) ? Path.GetFileName(fullName) : fileName;
string ftpfullpath = $"ftp://{ipAddr}{_port}//{fileName}";
Uri target = new Uri(ftpfullpath);
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(target);
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = new NetworkCredential(account, password);
//request.KeepAlive = false;// 是否保留连贯 设置了这个并不能失效 异步上传
request.UseBinary = true;// ftp 默认是传输二进制
request.ServicePoint.ConnectionLimit = maxConnect;// 最大连接数
// Store the request in the object that we pass into the
// asynchronous operations.
state.Request = request;
state.FullName = fullName;
state.ProcessCall = process;
state.Operate = FtpOperate.UpLoad;
// 文件大小
FileInfo file = new FileInfo(fullName);
state.Size = file.Length;
// Get the event to wait on.
waitObject = state.OperationComplete;
// Asynchronously get the stream for the file contents.
request.BeginGetRequestStream(new AsyncCallback(EndGetStreamCallback),
state
);
// Block the current thread until all operations are complete.
waitObject.WaitOne();
// The operations either completed or threw an exception.
if (state.OperationException != null)
{if (UploadFail != null)
{UploadFail.Invoke(state, state.OperationException);
return;
}
throw state.OperationException;
}
else
{if (UploadSuccess != null)
{UploadSuccess.Invoke(state, state.StatusDescription);
return;
}
}
}
catch (Exception ex)
{if (UploadFail != null)
{UploadFail.Invoke(state, ex);
return;
}
}
}
利用多线程 异步上传:
这个如果设置了线程池的线程数量,并不能管制每次执行的线程数量限度在 3 个以内,因为异步的连贯没有关掉导致了,临时没有想到怎么敞开好,因为每次创立多个连贯 会导致性能不佳(频繁屡次连贯耗费性能比拟大),集体感觉如果是所有上传工作都完结了 再关掉开启的连贯 这样是最初,如果你实现了这种形式,欢送在下方留言。这边设置了 ftp 的最大连接数为 3,如果线程池中线程超过 3 个,就会进入队列,等队列中有线程实现了,前面才会开启新的线程进入 这个队列(以此类推)。
留神:request.KeepAlive 为 false, 最终所有连贯都会主动敞开,然而频繁连贯 ftp 性能会损耗,不实用太多的文件上传。
下载性能:
当然如果是多线程也须要设置,因为这个下载是同步下载的。
ThreadPool.SetMinThreads(1, 1); // 设置最小线程数为 1 个
ThreadPool.SetMaxThreads(5, 5); // 设置最大线程数为 5 个,这两个办法要配合应用能力控制线程数量
效果图:
源码地址:https://gitee.com/ten-ken/personal-manage.git
性能示意
至于断点续传,稍加革新就行了,等你发现哦!
欢送关注我的公众号:程序员 ken,程序之路,让咱们一起摸索,共同进步。
正文完