c# – 如果当前失败,如何继续队列中的其他任务?
发布时间:2020-12-15 21:45:30 所属栏目:百科 来源:网络整理
导读:我有一些代码执行如下所示的队列 Queue .GetConsumingEnumerable() .ToObservable() .Select(x = x.ObserveOn(NewThreadScheduler.Default)) .SubscribeOn(NewThreadScheduler.Default) .Subscribe( grp = grp.ForEachAsync(b = b.Execute()) .ContinueWith(
我有一些代码执行如下所示的队列
Queue .GetConsumingEnumerable() .ToObservable() .Select(x => x.ObserveOn(NewThreadScheduler.Default)) .SubscribeOn(NewThreadScheduler.Default) .Subscribe( grp => grp.ForEachAsync(b => b.Execute()) .ContinueWith(ExecuteOnTaskFailure,TaskContinuationOptions.OnlyOnFaulted)); ExecuteOnTaskFailure方法定义如下 private static void ExecuteOnTaskFailure(Task previousTask) { if (!previousTask.IsFaulted) return; if (previousTask.Exception != null && previousTask.Exception.InnerExceptions != null) foreach (var exception in previousTask.Exception.InnerExceptions) { Logger.Error("Task failed continued to the next task : " + exception.Message,exception); } } 这不起作用.我似乎无法弄清楚如何让队列中的任务继续执行,即使其中一个任务无法执行.还有一种方法让我在队列结束时重新排队这个失败的任务吗? 这里的任何帮助非常感谢. 解决方法
听起来你想要的是循环中的try-catch:
grp.ForEachAsync(async b => { try { await b.Execute(); } catch (Exception ex) { Logger.Error(ex); Queue.Add(b); } }) 但是BlockingCollection并不是非常非同步,因为当它为空时它会阻塞(顾名思义).您可能想要考虑不同的方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |