在循环中使用线程

时间:2014-05-08 12:52:45

标签: c# multithreading

我有一个如下所示的循环

while (something)
{
     System.Threading.Thread newthread = new System.Threading.Thread(() => CreatePDF(strPDFHTML, filePath));
     newthread.Start();

     Console.WriteLine("Creating PDF.");
}

当我创建一个新的Thread对象并将它放在newthread中时,就像我在循环中那样...在循环的第二次迭代中,先前运行的线程是否被覆盖/中断?会出现什么问题(如果有的话)?

4 个答案:

答案 0 :(得分:3)

  

[...]是先前运行的线程被覆盖

实际上它没有被覆盖:你在每次迭代中都在创建一个新的引用。

这应该没问题,除非你想管理你在整个循环中创建的线程(例如,你将如何设法结束一些线程?)。

另一方面,我会看一下TaskFactoryThreadPool

答案 1 :(得分:2)

线程的句柄丢失,但线程本身将继续运行直到完成。除非您有一些内部沟通,否则您将无法确定线程何时完成。

答案 2 :(得分:2)

如果我们逻辑地浏览您的程序,我们可以确切地知道发生了什么。

  1. 在内存中创建一个存储Thread对象的地方,我们会称他为newThread

    System.Threading.Thread newthread
    
  2. 您创建Thread对象的新实例,并在newThread变量中对其进行引用。

    newthread = new System.Threading.Thread(() => CreatePDF(strPDFHTML, filePath));
    
  3. 您查看newThread中的指针,然后将其关注到Thread对象,然后在该线程上调用Start()方法。

    newthread.Start();
    
  4. 循环结束,我们松开变量newThread,但newThread只是指向真实对象的指针,因此线程继续在后台运行,然后我们重复这个过程。

    }
    
  5. 在此示例中,您甚至不需要创建内存句柄newThread。您正在存储指针以便稍后再使用。当你创建对象时,你也有一个指向这个对象的指针,所以你也可以在开始时调用对象的开始,而不用费心去保持对线程的引用。

    new System.Threading.Thread(() => CreatePDF(strPDFHTML, filePath)).Start();
    

    上面我简单地创建了Thread对象并在其上调用了start。它的功能与您的代码完全相同。然而,无论如何都不会费心去做你正在失去的线程处理。

答案 3 :(得分:0)

虽然(某事)正在创建线程,但我认为第二个线程会有问题,因为该文件可能是从其他线程使用的。使用TASKS工厂等待你需要等待所有我会更新答案你怎么能用Task。


    // I prefer here to use ManualResetEvent better then while or while with timeout
    while(something)
    {
        Task.Factory.StartNew(() =>
        {
            CreatePDF(strPDFHTML, filePath)
        }, TaskCreationOptions.LongRunning); // this way you do not need sleep
    }

您可以执行任务Task.WaitAll()或者您可以在需要取消时添加取消令牌;你也可以在主线程中获得AggreateException,这将帮助你找到问题所在的地方et.c