我有一个如下所示的循环
while (something)
{
System.Threading.Thread newthread = new System.Threading.Thread(() => CreatePDF(strPDFHTML, filePath));
newthread.Start();
Console.WriteLine("Creating PDF.");
}
当我创建一个新的Thread
对象并将它放在newthread
中时,就像我在循环中那样...在循环的第二次迭代中,先前运行的线程是否被覆盖/中断?会出现什么问题(如果有的话)?
答案 0 :(得分:3)
[...]是先前运行的线程被覆盖
实际上它没有被覆盖:你在每次迭代中都在创建一个新的引用。
这应该没问题,除非你想管理你在整个循环中创建的线程(例如,你将如何设法结束一些线程?)。
另一方面,我会看一下TaskFactory
或ThreadPool
。
答案 1 :(得分:2)
线程的句柄丢失,但线程本身将继续运行直到完成。除非您有一些内部沟通,否则您将无法确定线程何时完成。
答案 2 :(得分:2)
如果我们逻辑地浏览您的程序,我们可以确切地知道发生了什么。
在内存中创建一个存储Thread
对象的地方,我们会称他为newThread
System.Threading.Thread newthread
您创建Thread
对象的新实例,并在newThread
变量中对其进行引用。
newthread = new System.Threading.Thread(() => CreatePDF(strPDFHTML, filePath));
您查看newThread
中的指针,然后将其关注到Thread
对象,然后在该线程上调用Start()
方法。
newthread.Start();
循环结束,我们松开变量newThread
,但newThread
只是指向真实对象的指针,因此线程继续在后台运行,然后我们重复这个过程。
}
在此示例中,您甚至不需要创建内存句柄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