C# 无法将不同的字符串值传递给不同的线程
我想使用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”开头 我找不到任何优雅的解决方案。你有什么建议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以值
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我将保持原样,这样人们就可以看到不应该做的事情!如果你想了解更多这方面的信息,这个答案是正确的,因为“匿名方法关闭变量,而不是值。”这应该为你提供查找更多主题信息所需的搜索词。