不断创建多线程

时间:2014-07-31 08:27:50

标签: multithreading c#-4.0

我有一个包含文件路径的字符串列表。列表元素的数量是80.我想连续创建8个线程,直到列表中的文件移动。如果一个线程完成它的工作,我将创建一个线程,使线程数必须为8.

有人能帮助我吗?

1 个答案:

答案 0 :(得分:1)

除非每个线程都写入不同的驱动器,否则复制文件的多个线程比使用单个线程更慢 。磁盘驱动器一次只能做一件事。如果你有八个线程都试图写入同一个磁盘驱动器,那么需要额外的时间来进行磁头搜索等。

此外,如果您没有至少8个CPU内核,那么尝试运行8个并发线程将需要额外的线程上下文切换。如果您在四核计算机上执行此操作,那么您不应该使用四个以上的线程。

如果你真的需要八个线程来做这个,那么把所有的文件路径放到一个BlockingCollection,启动八个线程,并让它们开始工作。所以你有八个持久线程,而不是一直启动和停止线程。像这样:

BlockingCollection<string> filePaths = new BlockingCollection<string>();
List<Thread> threads = new List<Thread>();

// add paths to queue
foreach (var path in ListOfFilePaths)
    filePaths.Add(path);
filePaths.CompleteAdding();

// start threads to process the paths
for (int i = 0; i < 8; ++i)
{
    Thread t = new Thread(CopyFiles);
    threads.Add(t);
    t.Start();
}

// threads are working. At some point you'll need to clean up:
foreach (var t in threads)
{
    t.Join();
}

您的CopyFiles方法如下所示:

void CopyFiles()
{
    foreach (var path in filePaths.GetConsumingEnumerable())
    {
        CopyTheFile(path);
    }
}

由于您使用的是.NET 4.0,因此可以使用Task代替Thread。代码将大致相似。