2016-11-28 162 views
0

我创建了一个使用动态线程的应用程序,使用下面的函数:在C#中的线程池类管理线程执行

foreach (DataGridViewRow row in dtConexiones.Rows) 
     { 
      Object ip = Convert.ToString(row.Cells["ip"].Value); 
      ThreadPool.QueueUserWorkItem(new WaitCallback(setTimer), ip); 
      Console.Read(); 
     } 

您可能会注意到创建多个线程,基于数量记录在“ip”列中,在Datagridview控件中,我的意思是,我有五条记录,所以我有五个线程。

以相同的方式ThreadPool.QueueUserWorkItem (new WaitCallback (setTimer), ip); 创建线程,并执行SetTimer函数接收作为参数的值IP,它是一个字符串,以创建为每个线程的定时器。

这个过程完美地工作,线程被创建,但是当程序被执行时,线程1被执行一次,然后线程2被无限期地运行。

如何管理由ThreadPool创建的线程,以便它们可以逐个执行,而无需运行线程x?

在下面的执行图中,您可以看到线程192.168.1.123是如何执行两次的,并且从那里开始,线程192.168.1.124被无限期执行,当我希望两者都在par上执行时。问候并感谢您的宝贵帮助。

enter image description here

+0

请不要插入文本图像 - 只需复制并粘贴文本,选中它并键入Ctrl-K以在预先格式化的部分中将其缩进。尽管如此,我不确定这个问题 - 如果你想要主动控制线程,那么你应该考虑使用除了系统ThreadPool以外的其他东西,它用于简单的任务分派。 – Petesh

+0

感谢您的建议,我会用您的观察来编辑此问题。至于使用另一个ThreadPool替代方法,我想知道这个替代方案,因为我只想管理一个接一个执行的动态线程,并且这些线程执行时不会影响其他可以在par上运行的线程。感谢您的回答 –

回答

0

既然你wan't到一次运行一个线程,我只想设置一个布尔值,以确定前一个线程是否仍是启动下一个之前活跃。

我会确保正确处理线程排序,因为如果您正在处理等待相同功能的多个线程(设置线程优先级并未解决此问题),则FIFO不会保证。

+0

实际上,我的想法是检查线程是否正在运行,并在一个线程和另一个线程之间交换执行以消耗函数setTimer() –