2016-01-14 63 views
-1

林项目添加到ListView,但我需要能够运行一个线程对每个项目获得更多的数据,该项目(需要更长的时间来获得) 这只是一个小样本我尝试现在,但由于某种原因线程打印约5项左右的名称,然后等待5秒BackgroundWorker的阵列在一个循环

private void worker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    Console.WriteLine((string)e.Argument); 
    Thread.Sleep(5000); 
} 

BackgroundWorker[] threadArray = new BackgroundWorker[items.Count]; 

int gIndex = -1; 
foreach (Item gItem in items.Values) 
{ 
    gIndex++; 

    ItemDescription ID = getDescription(gItem.id); 

    _ListViewAddRow(gIndex, ID.name, ID.url); 

    threadArray[gIndex] = new BackgroundWorker(); 
    threadArray[gIndex].DoWork += new DoWorkEventHandler(worker_DoWork); 
    threadArray[gIndex].RunWorkerAsync(ID.name); 
} 
+2

这就是我希望它做的从这个代码。你在期待什么? – steve16351

+0

我希望它等待5秒钟,这两点打印下一个项目之前,但其约5个印刷 - 7项,然后等待5秒钟,然后打印另5 - 7项 – ramafe

+0

背景工人并行运行,所以你”重新首先在大致相同的时间开始每个项目一个线程,它们都打印,然后他们在等待5秒,在并行。他们不会一个接一个地执行。 – steve16351

回答

0

为@steve有提
使用一个后台工作。

 BackgroundWorker threadArray = new BackgroundWorker; 
     List<string> list = new List<string>(); 

     foreach (Item gItem in items.Values) 
     {//your code 

       list.Add(ID.name); 
     } 
    threadArray.RunWorkerAsync(list); 
现在

在DoWork的做投值的字符串列表回 做的工作方法

private void worker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    List<string> genericlist = e.Argument as List<string>;//cast 
     for (int i = 0; i < genericlist.Count; i++) { 
      Console.WriteLine(genericlist[i]); 
      Thread.Sleep(5000); 
     } 

}