因此,基本上,我想做的是,如果特定线程捕获了错误,我希望parallel.foreach重复该日志。
Parallel.ForEach(concurrentLogs, parallelOptions, log =>
try{
//Do work
Console.WriteLine(log);
}
catch(Exception ex) {
concurrentLogs.Enqueue(log); //repeat this log
}
});
因为在调试时,如果线程捕获到错误(例如io异常),它将不再重复相同的日志。
这可能是什么方法?
您正在枚举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
,或者您使用的效率不高。您可能要查看BlockingCollection
,Channel
或ActionBlock
(TPL数据流)。
Parallel.ForEach(concurrentLogs, parallelOptions, log => {
bool sucess = true;
do
{
try
{
//Do work
Console.WriteLine(log);
}
catch (Exception ex)
{
sucess = false;
}
}while(!sucess)
});