创建X个同时执行任务的线程

本文关键字:执行任务 线程 创建 | 更新日期: 2023-09-27 18:00:30

我试图动态创建X个数量的线程(由用户指定),然后基本上让所有线程在1秒的时间内同时执行一些代码。

我遇到的问题是,我试图完成的任务依赖于一个循环来确定当前IP是否等于最后一个IP。(它扫描主机)因此,由于我在内部有这个循环,它会关闭,然后其他线程不会被创建,也不会执行代码。我希望它们同时关闭,等待1秒(使用计时器或其他不会锁定线程的东西,因为它正在执行的代码有一个等待的超时时间。)有人能帮我吗?这是我当前的代码:

            int threads = Convert.ToInt32(txtThreads.Text);
            List<Thread> workerThreads = new List<Thread>();
            string from = txtStart.Text, to = txtEnd.Text;
            uint current = from.ToUInt(), last = to.ToUInt();
            ulong total = last - current;
            for (int i = 0; i < threads; i++)
            {
                Thread thread = new Thread(() =>
                {
                    for (int t = 0; t < Convert.ToInt32(total); t += i)
                    {
                        while (current <= last)
                        {
                            current = Convert.ToUInt32(current + t);
                            var ip = current.ToIPAddress();
                            doSomething(ip);
                        }
                    }
                });
                workerThreads.Add(thread);
                thread.Start();
            }

创建X个同时执行任务的线程

不要将lambda用作线程的主体,否则i值不会执行您认为它正在执行的操作。相反,将值传递到方法中。

至于同时启动所有线程,请执行以下操作:

private object syncObj = new object();
void ThreadBody(object boxed)
{
    Params params = (Params)boxed;
    lock (syncObj)
    {
        Monitor.Wait(syncObj);
    }
    // do work here
}
struct Params
{
    // passed values here
}
void InitializeThreads()
{
    int threads = Convert.ToInt32(txtThreads.Text);
    List<Thread> workerThreads = new List<Thread>();
    string from = txtStart.Text, to = txtEnd.Text;
    uint current = from.ToUInt(), last = to.ToUInt();
    ulong total = last - current;
    for (int i = 0; i < threads; i++)
    {
        Thread thread = new Thread(new ParameterizedThreadStart(this.ThreadBody, new Params { /* initialize values here */ }));
        workerThreads.Add(thread);
        thread.Start();
    }
    lock(syncObj)
    {
        Monitor.PulseAll(syncObj);
    }
}

您遇到了闭包问题。这里还有另一个问题在一定程度上解决了这个问题。

基本上,您需要在创建每个任务时捕获i的值。实际情况是,当任务开始实际运行时,所有任务中i的值都是相同的——循环结束时的值。