gpt4 book ai didi

C# 并行 Foreach 重复方法

转载 作者:行者123 更新时间:2023-11-30 15:13:23 24 4
gpt4 key购买 nike

所以基本上,我正在尝试做的是,如果特定线程发现错误,我希望 parallel.foreach 重复日志。

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

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

解决这个问题的可能方法是什么?

最佳答案

您正在枚举一个 ConcurrentQueue,它将是集合的快照,不会反射(reflect)您以后的 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);
}
});

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

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

关于C# 并行 Foreach 重复方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59119337/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com