C# 使用线程提取一些文件

C# 使用线程提取一些文件,c#,multithreading,threadpool,C#,Multithreading,Threadpool,我有个问题。我需要处理一些文件夹中的文件,并将所有文件解压缩到一个文件夹中 我的问题是线程丢失或无法正常工作 Product lstProduct = new Product(); lstProduct = XML.LoadProducts(); List<Thread> threads = new List<Thread>(); for (int i = 0; i < lstProduct.Length; i++) { Thread thread =

我有个问题。我需要处理一些文件夹中的文件,并将所有文件解压缩到一个文件夹中

我的问题是线程丢失或无法正常工作

Product lstProduct = new Product();

lstProduct = XML.LoadProducts();
List<Thread> threads = new List<Thread>();

for (int i = 0; i < lstProduct.Length; i++)
{
    Thread thread = new Thread(new ParameterizedThreadStart(ExtractFiles));
    thread.SetApartmentState(ApartmentState.STA);
    threads.Add(thread);
}

for (int i = 0; i < threads.Count; i++)
{
    threads[i].Start(produtosConfiguracao[i]);
}
Product lstProduct=新产品();
lstProduct=XML.LoadProducts();
列表线程=新列表();
对于(int i=0;i
调用函数:

public void ExtractFiles(object config)
{
    Product product= (Product)config;
    try
    {
        ThreadPool.SetMaxThreads(Int32.Parse(product.Threads),    Int32.Parse(product.Threads));
        DirectoryInfo di = new DirectoryInfo(product.Path);
        List<FileInfo> lstFiles= di.GetFiles(product.Type).Where(o => o.Extension == ".zip").ToList();

        foreach (FileInfo fileInfo lstFiles)
        {
            lock(this)
            {
                FileProduct fileProduct = new FileProduct();
                fileProduct.File= fileInfo;
                fileProduct.Product = product;
                ThreadPool.QueueUserWorkItem(new WaitCallback(ExtractAndMove), fileProduct);
            }
        }
        catch (Exception ex)
        {
            throw;
        }
    }
公共文件(对象配置)
{
产品产品=(产品)配置;
尝试
{
SetMaxThreads(Int32.Parse(product.Threads)、Int32.Parse(product.Threads));
DirectoryInfo di=新的DirectoryInfo(product.Path);
List lstFiles=di.GetFiles(product.Type).Where(o=>o.Extension==“.zip”).ToList();
foreach(FileInfo FileInfo lstFiles)
{
锁(这个)
{
FileProduct FileProduct=新的FileProduct();
fileProduct.File=fileInfo;
fileProduct.Product=Product;
QueueUserWorkItem(新的WaitCallback(ExtractAndMove),fileProduct);
}
}
捕获(例外情况除外)
{
投掷;
}
}

您应该考虑使用I/O函数的*Async重载,如果可以的话,在4.5中使用Async/await。您正在尝试做一些操作系统通过IOCP为您做的事情。

我只想说,操作多个线程来执行IO工作不太可能导致性能提升t、 这很可能会导致性能下降,具体取决于您运行的并发线程数量。这些线程都将竞争IO,这将成为您的瓶颈。是的,除非提取是CPU限制的,否则在问题上抛出额外线程/并发读取只会导致IO拥塞并降低速度此外,您使用的是公共实例方法,因此最好声明一个私有对象成员变量作为锁令牌。此代码可能只是死锁。STA线程的一个硬要求是它必须泵送一个消息循环。尝试在TP线程上运行提取代码是徒劳的,COM会封送调用在FileProduct对象上返回STA线程。不管怎样,它都会尝试。只是不麻烦。