C#并行Foreach重复方法

问题描述 投票:2回答:2

因此,基本上,我想做的是,如果特定线程捕获了错误,我希望parallel.foreach重复该日志。

Parallel.ForEach(concurrentLogs, parallelOptions, log =>
  try{
   //Do work
   Console.WriteLine(log);
  }
  catch(Exception ex) {
  concurrentLogs.Enqueue(log); //repeat this log
  }
});

因为在调试时,如果线程捕获到错误(例如io异常),它将不再重复相同的日志。

这可能是什么方法?

c#
2个回答
3
投票

您正在枚举ConcurrentQueue,它将是集合的快照,不会反映出您以后的Enqueue项目。

快速解决方案是在“ foreach”内重试:

Parallel.ForEach(concurrentLogs, parallelOptions, log =>
{
    void DoWork(string log)
    {
        //Do work
        Console.WriteLine(log);
    }

    try
    {
        DoWork(log);
    }
    catch(Exception ex) { // or loop and keep count
        DoWork(log);
    }
});

旁:如评论中所述,这不是处理重试的最佳方式,您需要确定策略。波莉非常适合这类事情。

但是这表明您不想要ConcurrentQueue,或者您使用的效率不高。您可能要查看BlockingCollectionChannelActionBlock(TPL数据流)。


1
投票
            Parallel.ForEach(concurrentLogs, parallelOptions, log => { 
            bool sucess = true;
            do
            {
                try
                {
                    //Do work
                    Console.WriteLine(log);
                }
                catch (Exception ex)
                {
                    sucess = false;
                }
            }while(!sucess)

        });
© www.soinside.com 2019 - 2024. All rights reserved.