C# 如何启动队列中的多个线程?

C# 如何启动队列中的多个线程?,c#,multithreading,queue,C#,Multithreading,Queue,我正在制作服务器客户端应用程序。当我选择多个like(n)文件进行复制/粘贴时,客户端可以管理服务器文件(重命名/复制/删除等),它将启动(n)个pasteC线程 我需要一种让他们排队的方法。我该怎么做 private void Paste() { foreach (ListViewItem item in copiedItems) { Thread pasteC = new Thread(unused => fmc.PasteFromCopy(item.T

我正在制作服务器客户端应用程序。当我选择多个like(n)文件进行复制/粘贴时,客户端可以管理服务器文件(重命名/复制/删除等),它将启动(n)个pasteC线程

我需要一种让他们排队的方法。我该怎么做

private void Paste()
{
    foreach (ListViewItem item in copiedItems)
    {
        Thread pasteC = new Thread(unused => fmc.PasteFromCopy(item.Text, somePath));
        pasteC.Start();
    }
}
代码在fmc类中

public void PasteFromCopy(string source,string dest)
{
    if (IsFolder(source))
    {
        CopyDirectory(source, dest);
    }
    else
    {
        CopyStream(source, dest); 
    }
}
我已经弄明白了

public void PasteFromCopy(string source,string dest)
{
    lock(this)
    {
        if (IsFolder(source))
        {
            CopyDirectory(source, dest);
        }
        else
        {
            CopyStream(source, dest); 

        }
    }
}

我认为这里没有理由使用线程。你只是让你的代码变得更复杂,消耗了太多的内存(每个线程需要1MB的内存)。这样做,您就不必担心队列或锁:

private void Paste()
{
    foreach (ListViewItem item in copiedItems)
    {
        fmc.PasteFromCopy(item.Text, somePath);
    }
}
编辑:

如果您需要使用主线程以外的线程,因为您不想锁定它,那么可以使用一个线程来执行所有复制。比如:

private void Paste()
{
    var thread = new Thread(() =>
    {
        foreach (ListViewItem item in copiedItems)
        {
            fmc.PasteFromCopy(item.Text, somePath);
        }
    });
    thread.Start();
}

仍然不需要使用锁,而且比使用多线程的解决方案更节省内存。

您没有向队列添加任何内容。您只是锁定了这段代码。这没有任何意义。为什么要创建所有线程,而它们只等待对方?这是一个大文件副本。。假设每个文件有1G字节。。我有3个文件。。你想让计算机同时启动这些线程吗??为了我。。锁只是工作得很完美。@MurHafSoz,不,我根本不会使用线程,这没有任何意义,只会使您的代码更加复杂。很抱歉,我没有解释我的应用程序。。它的客户端服务器。。它让我能够控制文件和文件夹。。并探索它们。。所以如果我不使用线程。。它将延迟,我将无法在复制文件时进行探索。。你怎么看?为什么它从n个线程开始?复制文件通常不受CPU限制,因此线程实际上会使复制速度变慢,而不是变快。如果您想按顺序运行线程,为什么不直接运行,而不使用任何线程呢?很抱歉,我没有解释我的应用程序。。它的客户端服务器。。它让我能够控制文件和文件夹。。并探索它们。。所以如果我不使用线程。。它将延迟,我将无法在复制文件时进行探索。。所以我必须使用线程,这样我可以在复制时浏览、重命名、查看大小和所有其他内容。然后只使用一个线程,请参见编辑我的答案。好的,这里有一件事。。出于某些原因,我需要确认每个文件,并检查是否存在这些文件。。我每次向服务器发送一个要复制的文件(路径)。。它使用一个线程来实现这一点。。因此,服务器从客户端接收路径,客户端在FOREACH循环中发送路径。。这意味着它不会在一次发送中发送所有路径。。所以它会运行很多线程。。这就是我为什么要用锁的原因。。因为每个文件都使用一个线程。。我尝试了很多次来编辑我的代码,以使用最好的方式。。但事情就是这样结束的。。如果你知道我的意思。客户端有当前文件夹/文件的列表视图。。它检查每个副本的文件/文件夹是否存在。。显示确认消息。。如果是,则将路径发送到服务器。。如果没有。。它跳转到另一个文件,就像那样..不,我真的不知道你的意思。如果你不解释你到底需要什么,只知道你已经告诉了我们,你就很难帮助你。现在看起来您实际上需要的是一个队列,一个线程从中获取项目并进行复制,另一个线程可以向队列中添加项目。最简单的方法是使用
BlockingCollection
!!如果锁工作正常,我为什么要使用BlockingCollection??它需要很多内存吗?是的,就像我说的,每个线程需要1MB内存。这意味着,如果复制1000个文件,可能会耗尽内存。而且,
lock
不保证任何订单,
BlockingCollection
保证。