如何从C#中的特定点开始线程?
这段代码的作用是,它列出并从FTP服务器下载文件 该代码在单线程上运行良好。下载文件的逻辑是“balance_load()”&它根据一个算法(即负载分布)下载文件 我正在使用ftpClient.DownloadFileAsync() 我只想实现特定任务的多线程。i、 e.不是整个功能,而是在for循环内。 但这段代码相当于同时执行整个函数2次。文件下载两次如何从C#中的特定点开始线程?,c#,ftp-client,C#,Ftp Client,这段代码的作用是,它列出并从FTP服务器下载文件 该代码在单线程上运行良好。下载文件的逻辑是“balance_load()”&它根据一个算法(即负载分布)下载文件 我正在使用ftpClient.DownloadFileAsync() 我只想实现特定任务的多线程。i、 e.不是整个功能,而是在for循环内。 但这段代码相当于同时执行整个函数2次。文件下载两次 Thread workerThread = new Thread(new ThreadStart(btnrepeat)); workerTh
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();*/
}
}
threadworkerThread=新线程(新线程开始(btnrepeat));
workerThread.Start();
线程工作线程2=新线程(新线程开始(btnrepeat));
workerThread2.Start();
受保护的无效btnrepeat()
{
FtpWebRequest ftpRequest=(FtpWebRequest)WebRequest.Create(“ftp://192.168.0.117/");
ftpRequest.Credentials=新的网络凭证(“win10”、“zzzz”);
ftpRequest.Method=WebRequestMethods.Ftp.ListDirectory;
FtpWebResponse响应=(FtpWebResponse)ftpRequest.GetResponse();
StreamReader StreamReader=新的StreamReader(response.GetResponseStream());
列表目录=新列表();
string line=streamReader.ReadLine();
而(!string.IsNullOrEmpty(line))
{
目录。添加(行);
line=streamReader.ReadLine();
}
streamReader.Close();
使用(WebClient ftpClient=new WebClient())
{
ftpClient.Credentials=新系统.Net.NetworkCredential(“win10”、“zzzz”);
对于(int i=0;我建议不要直接使用线程,而是使用。如果你不想阻止当前线程,你可以在一个workerThread
上运行Parallel.Foreach
。你不需要Parallel.Foreach或线程。你需要先清理代码。把WebClient和WebRequests混在一起有什么意义?此外,你可以n使用异步方法和async/await
而不是阻塞方法,例如var response=await request.GetResponseAsync();
@PanagiotisKanavos我认为这会更容易。一旦清理代码并使用异步方法,您就可以决定是否需要实际并行执行多个请求。使用异步方法,您只需一次生成多个请求,收集由GetResponseAsync()生成的所有任务
调用并使用等待任务.WhenAll(任务列表)等待
@JeroenvanLangen它会浪费线程等待响应。快速脏脚本编写没问题,生产代码尤其是web应用程序不能接受。此外,并行。ForEach
将使用有限数量的任务。不过,网络操作并不真正需要线程,它们只是等待响应。您可以启动我建议不要直接使用线程,而是使用。如果你不想阻止当前线程,你可以在一个workerThread
上运行Parallel.Foreach
。你不需要Parallel.Foreach或threads。你需要先清理代码。把WebClient和WebRequests混在一起有什么意义?此外,你还需要您可以使用异步方法和async/await
而不是阻塞方法,例如var response=await request.GetResponseAsync();
@PanagiotisKanavos我认为这会更容易。一旦清理代码并使用异步方法,您就可以决定是否需要实际并行执行多个请求。使用异步方法,您只需一次生成多个请求,收集由GetResponseAsync()生成的所有任务
调用并使用等待任务.WhenAll(任务列表)等待
@JeroenvanLangen它会浪费线程等待响应。快速脏脚本编写没问题,生产代码尤其是web应用程序不能接受。此外,并行。ForEach
将使用有限数量的任务。不过,网络操作并不真正需要线程,它们只是等待响应。您可以启动一下子就有很多