C#多线程方法参数VS.线程参数

时间:2016-04-20 20:02:42

标签: c# multithreading

我有以下几行代码。

mPath是一个包含3个csv文件的给定路径。

这段代码的作用是遍历mPath中的所有文件,提取其内容,并将其与我已经拥有的某个数据结构(称为“数据”)进行比较,其中包含其他2个文件的内容。无论“CopyCompareSingleFile”内部发生什么都无关紧要。我为mPath中的每个文件创建了一个不同的线程,以便与“data”进行比较。

我的问题是,如果我将filePath作为参数传递给我的线程,然后从线程传输到我的方法,一切正常:

//Iterate through all files from path #1, and compare with data collected from path #2
LinkedList<Thread> threads = new LinkedList<Thread>();

foreach (string filePath in Directory.EnumerateFiles(mPath1, "*", SearchOption.TopDirectoryOnly))
{
    var thread = new Thread(file => CopyCompareSingleFile(file.ToString(), data));
    threads.AddLast(thread);
    thread.Start(filePath);
}

//Join all threads
foreach (Thread thread in threads)
{
    thread.Join();
}

输出: enter image description here

=============================================== ===============

但是,我的原始代码是创建这些线程而不用将参数传递给它们。意思是,filePath作为参数直接传输给方法。并且输出很奇怪 - 似乎只有最后一个文件被用于所有线程......而且我不确定为什么。

注意:如果我在“开始”之后输入“Thread.Sleep(1000)”,它将正常工作。但我想知道为什么它不能正常工作。

//Iterate through all files from path #1, and compare with data collected from path #2
LinkedList<Thread> threads = new LinkedList<Thread>();

foreach (string filePath in Directory.EnumerateFiles(mPath1, "*", SearchOption.TopDirectoryOnly))
{
    var thread = new Thread(()=> CopyCompareSingleFile(filePath, data));
    threads.AddLast(thread);
    thread.Start();
}

//Join all threads
foreach (Thread thread in threads)
{
    thread.Join();
}

输出: enter image description here

0 个答案:

没有答案