所以,我将阅读用户信息的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。如果是,请等待该线程完成,然后启动该线程。
但有没有更好的方法呢?
答案 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**);
}