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

时间:2014-04-28 19:03:56

标签: c# .net multithreading

我正在尝试动态创建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();
            }

2 个答案:

答案 0 :(得分:3)

不要使用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);
    }
}

答案 1 :(得分:0)

你遇到了关闭问题。还有一个问题在某种程度上解决了这个问题,here

基本上,您需要在创建每个任务时捕获i的值。发生的事情是当任务到达实际运行时,所有任务中i的值都是相同的 - 循环结束时的值。