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();
    }
}