2016-11-28 161 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() –