如何通过多线程完成这项工作?

时间:2015-12-07 08:17:17

标签: c# multithreading

所以,我将阅读用户信息的arraylist并用它完成一些任务。

如,

for(int i=0;i<lines.Count();i++){
  new Thread(() =>
        {
        Thread.CurrentThread.IsBackground = true;

        ...some task over here which would take 4-5 minutes

        }).Start();
}

arraylist数据将是这样的:

  

用户,信息,信息

     

user2,info,info

     

user3,info,info

     

用户,信息,信息

正如您在第4行中看到的那样,第一个用户再次重复。

现在我想要的是检测是否已经为用户运行一个线程的方法。就像为用户运行2个线程(第1行和第4行)。哪个不应该发生。

我想到的是创建一个当前正在运行其线程的所有用户的arraylist,并在每次创建新线程时检查该arraylist。如果是,请等待该线程完成,然后启动该线程。

但有没有更好的方法呢?

2 个答案:

答案 0 :(得分:8)

Parallel.ForEach(lines.GroupBy(line => line.TheUser), grp => {
    // processing user grp.Key
    foreach(var line in grp) {
        // do the stuff here
    }
});

答案 1 :(得分:0)

在循环中,只需将项目复制到一个新变量(解决闭包问题)并将其传递给线程。

        ArrayList al = new ArrayList();
        foreach (var item in al)
        {
            **var obj = item;**
            new Thread(() =>
                       {
                           Thread.CurrentThread.IsBackground = true;

                           //...some task over here which would take 4 - 5 minutes

                       }).Start(**obj**);
        }