此代码的作用是,它列出并从FTP服务器下载文件。
代码适用于单线程。下载文件的逻辑在" balance_load()" &安培;它根据算法下载文件,即负载分配
我正在使用ftpClient.DownloadFileAsync()
我想只为特定任务实现多线程。即不是整个功能,而是在for循环中。 但是这段代码同时执行了2次整个函数。文件下载两次。
Thread workerThread = new Thread(new ThreadStart(btnrepeat));
workerThread.Start();
Thread workerThread2 = new Thread(new ThreadStart(btnrepeat));
workerThread2.Start();
protected void btnrepeat()
{
FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create("ftp://192.168.0.117/");
ftpRequest.Credentials = new NetworkCredential("win10", "zzzz");
ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory;
FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse();
StreamReader streamReader = new StreamReader(response.GetResponseStream());
List<string> directories = new List<string>();
string line = streamReader.ReadLine();
while (!string.IsNullOrEmpty(line))
{
directories.Add(line);
line = streamReader.ReadLine();
}
streamReader.Close();
using (WebClient ftpClient = new WebClient())
{
ftpClient.Credentials = new System.Net.NetworkCredential("win10", "zzzz");
for (int i = 0; i <= directories.Count - 1; i++)
{
if (directories[i].Contains("."))
{
string path = "ftp://192.168.0.117/" + directories[i].ToString();
string trnsfrpth = @"E:\\ProjectLocalPath\" + directories[i].ToString();
extension = System.IO.Path.GetExtension(directories[i]);
FtpWebRequest ftpRequest2 = (FtpWebRequest)WebRequest.Create(path);
ftpRequest2.Credentials = new NetworkCredential("win10", "zzzz");
ftpRequest2.Method = WebRequestMethods.Ftp.GetFileSize;
FtpWebResponse response2 = (FtpWebResponse)ftpRequest2.GetResponse();
filesize = (response2.ContentLength) / 1048576;
balance_load(directories[i],trnsfrpth);
Thread.Sleep(800);
}
}
Timer1.Enabled = false;
/* workerThread.Abort();
workerThread2.Abort();
workerThread3.Abort();*/
}
}