C# 如何动态创建线程并重新启动每个线程?
如何动态创建线程并在每个线程完成工作后重新启动它们 例如,我有一个列表,其中有许多计算机名被定义为类:C# 如何动态创建线程并重新启动每个线程?,c#,multithreading,C#,Multithreading,如何动态创建线程并在每个线程完成工作后重新启动它们 例如,我有一个列表,其中有许多计算机名被定义为类: public class GComputers { private List<string> list; public GComputers() { list = new List<string>(); } public List<string> GetList() { lo
public class GComputers
{
private List<string> list;
public GComputers()
{
list = new List<string>();
}
public List<string> GetList()
{
lock (list)
{
List<string> c_list = list.ToList<string>();
return c_list;
}
}
public void SetList(List<string> List)
{
lock (list)
{
list = List.ToList<string>();
}
}
public int GetCount()
{
return list.Count();
}
}
3.创建线程的线程管理器
public static void ThreadManager()
{
for (int i = 0; i < 10; i++)
{
Thread t = new Thread(DoWork);
t.Name = "Thread_" + i;
t.Start();
Console.WriteLine("Thread {0} started: ",t.Name);
}
}
此代码一次只能创建和启动10个线程。如何重新启动每个线程池,直到计算机列表中的项目超过0项为止?您正在尝试创建一个
线程池
看这里:
如果你想做你自己的。创建10个线程,它们将检查一个AutoResetEvent
。将项目放入工作队列时,只需触发AutoResetEvent。只有一个线程被通知可以处理工作项。我试图在这个页面上创建like:但是我的线程没有重新启动。看起来我不明白如何对多个线程执行此操作。您不应该重新启动线程。创建while循环,直到应用程序终止。在while循环中,让他们在无需处理的情况下等待AutoResetEvents。因此,在启动时启动线程。让他们等一个工作时间。关闭时终止它们。具体取决于您想要执行的操作(如果您有一个在开始时“已满”的集合,并且您想要在多个线程中对此集合执行某些操作,或者如果您有一个在“处理”旧数据时接收新数据的集合,则可以使用Parallel.ForEach
(第一种情况)或者BlockingCollection
(第二种情况),而不是重新发明轮子。正如@xanatos所说,TPL将使这变得更容易,但对您当前的代码有一个小小的补充:它不是线程安全的:如果您锁定list
的活动实例并更改list
引用的实例,活动锁将不再锁定同一对象,因此在释放旧锁之前可以获取新锁。对于这种实现,更容易使用某种包或队列,为您执行删除操作(例如,ConcurrentBag
)。(尽管通过使用Parellel.ForEach
,您可以处理所有元素而无需删除)感谢@Me.Name!在您的回答之后,我将其用作ThreadMan()函数:List complist=new List();complist=adc.GetList();ParallelOptions=新的ParallelOptions();options.MaxDegreeOfParallelism=numThreads;ParallelLoopResult=Parallel.ForEach(complist,options,(pcname)=>{DoWork(pcname);namestake++;});而(!result.IsCompleted)代码>并且工作正常!
public static void DoWork()
{
string pctocheck = GetPCName();
Console.WriteLine("PCName: {0}",pctocheck);
Thread.Sleep(1000);
}
public static void ThreadManager()
{
for (int i = 0; i < 10; i++)
{
Thread t = new Thread(DoWork);
t.Name = "Thread_" + i;
t.Start();
Console.WriteLine("Thread {0} started: ",t.Name);
}
}
class Program
{
static GComputers adc;
static void Main(string[] args)
{
adc = new GComputers();
ThreadManager();
}
}