C# 无法将不同的字符串值传递给不同的线程

C# 无法将不同的字符串值传递给不同的线程,c#,multithreading,C#,Multithreading,我想使用webclient方法下载多个文件,同时运行多个线程。我的url结构依赖于变量“inti”,所以我使用for循环来生成url和文件路径。问题是,在启动线程之前,url和filepath值都会更改。时间表如下所示: 在主循环中,url=“url1”和path=“filepath1” 使用值“url1”和“filepath1”调用Thread1 在主循环中,url=“url2”和path=“filepath2” 使用值“url2”和“filepath2”调用Thread2 Thread1以值

我想使用webclient方法下载多个文件,同时运行多个线程。我的url结构依赖于变量“inti”,所以我使用for循环来生成url和文件路径。问题是,在启动线程之前,url和filepath值都会更改。时间表如下所示:

在主循环中,url=“url1”和path=“filepath1”

使用值“url1”和“filepath1”调用Thread1

在主循环中,url=“url2”和path=“filepath2”

使用值“url2”和“filepath2”调用Thread2

Thread1以值“url2”和“filepath2”开头

Thread2以值“url2”和“filepath2”开头

我找不到任何优雅的解决方案。你有什么建议

string path = "";
string url = "";
string baseURL = "http://www.somewebsite.com/12/";
for (int i = 10; i <= DateTime.Now.Month; i++)
{
    path = "C:\\folder\\" + i.ToString() + ".html";
    url = baseURL + i.ToString();
    Thread webThread = new Thread(delegate()
    {
       downloadScheduleFile(url,path);
    });
    webThread.Start()
}

private void downloadScheduleFile(string url, string filepath)
{
    var client = new WebClient();
    try
    {
       client.DownloadFile(url, filepath);
    }
    catch(WebException e) {
       Console.WriteLine(System.Threading.Thread.CurrentThread.Name+e.Message);
    }
}
字符串路径=”;
字符串url=“”;
字符串baseURL=”http://www.somewebsite.com/12/";

对于(int i=10;i这是因为当线程启动时,
path
url
已更改。您必须创建更紧密的本地副本

string baseURL = "http://www.somewebsite.com/12/";
for (int i = 10; i <= DateTime.Now.Month; i++)
{
    string path = "C:\\folder\\" + i.ToString() + ".html"; // path declared here
    string url = baseURL + i.ToString(); // url declared here
    Thread webThread = new Thread(delegate()
    {
       downloadScheduleFile(url,path);
    });
    webThread.Start()
}
string baseURL=”http://www.somewebsite.com/12/";

对于(int i=10;i您编写代码的方式调用downloadScheduleFile的所有线程都引用了包含块中定义的相同的2个变量。您应该做的是为每个线程提供自己的变量集。

您需要在委托的外部范围内捕获变量,我非常确定您可以这样做:

string path = "";
string url = "";
string baseURL = "http://www.somewebsite.com/12/";
for (int i = 10; i <= DateTime.Now.Month; i++)
{
    path = "C:\\folder\\" + i.ToString() + ".html";
    url = baseURL + i.ToString();
    Thread webThread = new Thread(delegate()
    {
       string innerPath = path;
       string innerUrl = url
       downloadScheduleFile(innerUrl,innerPath);
    });
    webThread.Start()
}
字符串路径=”;
字符串url=“”;
字符串baseURL=”http://www.somewebsite.com/12/";

对于(int i=10;i这一个可能有一个争用条件。在线程创建和内部路径分配之间,path的值可能已更改。因此,您可以有两个具有相同路径值的线程。这与OP的代码有相同的问题。您需要在
for
循环内,但在closu外分配变量的副本re.是的,我错了,我把本地声明放在委托范围内了!:o我将保持原样,这样人们就可以看到不应该做的事情!如果你想了解更多这方面的信息,这个答案是正确的,因为“匿名方法关闭变量,而不是值。”这应该为你提供查找更多主题信息所需的搜索词。