Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从C#中的特定点开始线程?_C#_Ftp Client - Fatal编程技术网

如何从C#中的特定点开始线程?

如何从C#中的特定点开始线程?,c#,ftp-client,C#,Ftp Client,这段代码的作用是,它列出并从FTP服务器下载文件 该代码在单线程上运行良好。下载文件的逻辑是“balance_load()”&它根据一个算法(即负载分布)下载文件 我正在使用ftpClient.DownloadFileAsync() 我只想实现特定任务的多线程。i、 e.不是整个功能,而是在for循环内。 但这段代码相当于同时执行整个函数2次。文件下载两次 Thread workerThread = new Thread(new ThreadStart(btnrepeat)); workerTh

这段代码的作用是,它列出并从FTP服务器下载文件

该代码在单线程上运行良好。下载文件的逻辑是“balance_load()”&它根据一个算法(即负载分布)下载文件

我正在使用ftpClient.DownloadFileAsync()

我只想实现特定任务的多线程。i、 e.不是整个功能,而是在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();*/
    }
}
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
将使用有限数量的任务。不过,网络操作并不真正需要线程,它们只是等待响应。您可以启动一下子就有很多