需要帮助您了解特定情况下的Parallel.ForEach

时间:2019-07-12 10:42:35

标签: c# multithreading

基本上,我有一个帐户列表,假设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
}

1 个答案:

答案 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);
                    }
                  });
             }
           }

如上所示,请告诉我是否有任何不利之处。