基本上,我有一个帐户列表,假设50,并且我必须运行它们,并且它们会执行某些操作。在一定条件下,如果满足条件,则该帐户必须等待15分钟才能处理某件事,然后该帐户会像其他线程一样继续前进。
所有线程完成后,代码等待30分钟,然后再次运行。
我担心的是,如果49个帐户不符合条件,并且该帐户只有1个帐户符合条件,则整个循环将等待15分钟,然后才能移出该帐户,然后等待30分钟以重新启动,因此导致代码重新启动现在是45分钟。
我该如何解决?
我知道我可以使用Thread方法并分别独立地运行它们,而彼此之间互不影响,等等,并且不会迫使其他人等待。 因此需要知道是否有可能在当前代码中添加一些内容。
当前代码:
while (true){
Parallel.ForEach(ds.Tables[0].AsEnumerable(), new ParallelOptions { MaxDegreeOfParallelism = int.Parse(ConfigurationManager.AppSettings["Threads"].ToString()) }, drow =>
{
// DO SOMETHING....
});
//Wait 30 min
}
答案 0 :(得分:-1)
再深入一点。我看到有些调整通过在另一个线程中运行整个Parallel循环并保持帐户记录正在运行,并且不要在重新启动时再次运行它们来使它起作用是不可能的。
像这样的东西:
while(true){
Task.Factory.StartNew(() => seperateThreadToRunParralelLoop(ds));
// Wait time i have to wait .......
}
function void seperateThreadToRunParralelLoop(ds)
{
Parallel.ForEach(ds.Tables[0].AsEnumerable(), new ParallelOptions { MaxDegreeOfParallelism = 30 }, drow =>
{
if (!runningAccounts.Contains(username))
{
runningAccounts.Add(username);
somefunction();
runningAccounts.remove(username);
}
});
}
}
如上所示,请告诉我是否有任何不利之处。