2014-04-28 44 views
0

我想动态创建X线程量(由用户指定)然后基本上它们都在同一时间执行一些代码,间隔为1秒。创建X线程,同时执行一个任务

我遇到的问题是我试图完成的任务依赖于循环来确定当前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(); 
      } 
+1

你可以删除你的'thread.Start'和之后的for循环,做'workerThreads.ForEach(T = > t.Start());' – Jonesopolis

+0

看来你想做网络事情。这意味着有很大的延迟。所以大部分线程都在等待。你应该考虑一个类似于node.js的事件循环,并使用异步和等待的东西。见这里[http://www.codeproject.com/Articles/481080/Continuous-asynchronous-Ping-using-TAP-and-IProgre]。 如果你仍然想使用线程,你也应该在每个线程上调用Join。 – schoetbi

+0

@schoetbi我实际上已经使用任务并行库创建了一个异步实现。我正在创建这个,所以我可以做一些基准测试。我主要是在寻找速度和准确性,所以我想看看哪个实现会更快。 – user1632018

回答

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); 
    } 
} 
+0

感谢您的帮助!我现在正在尝试,我们会看到它是如何发展的。 – user1632018

+0

这很好,谢谢。 – user1632018

+0

我应该为其他人添加,我实际上不能使用parameterizedthreadstart,并且必须使用:Thread thread = new Thread(()=> DoWork(paramobj));或者Thread thread = new Thread(()=> DoWork(param1,param2,param3));但这个答案仍然有效,除了轻微的变化。 – user1632018

0

你正在运行到关闭问题。还有一个问题可以解决这个问题,here

基本上,您需要在创建每个任务时捕获i的值。发生什么事是任务开始实际运行的时候,跨越所有任务的i的值是相同的 - 循环结束时的值。

相关问题