我有一些代码执行如下所示的队列
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);
}
}
这不起作用。我似乎无法弄清楚如何让队列中的任务继续执行,即使其中一个任务无法执行。还有一种方法让我在队列结束时重新排队这个失败的任务吗?
非常感谢任何帮助。
答案 0 :(得分:1)
听起来你想要的是循环中的try
- catch
:
grp.ForEachAsync(async b =>
{
try
{
await b.Execute();
}
catch (Exception ex)
{
Logger.Error(ex);
Queue.Add(b);
}
})
但是BlockingCollection
并不是非常非同步,因为当它为空时会阻塞(顾名思义)。您可能想要考虑不同的方法。