我在Observable.SelectMany中有一个异步选择器,该选择器抛出Exception并与Subscribeless的无参数重载结合在一起。这是一个.net 4.6.1控制台应用程序:
class Program
{
static async Task Main()
{
var source = Observable.Range(0,5);
source.SelectMany(async input =>
{
await Task.Delay(50).ConfigureAwait(false);
if (input % 4 == 0)
throw new Exception("BOOOM");
return input;
})
.Subscribe();
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
}
据我所知,此异常被转发给观察者的onError,并且默认实现只是重新抛出该异常。明确实现观察者表明,onError实际上是在后台线程上调用的。为什么在未处理的后台线程异常之后应用程序仍然有效?还是由Rx默默地处理了异常?问题的背景是,我在内部使用TPL Dataflow编写了一个SelectMany运算符,该运算符以相同的方式严重崩溃了所使用的应用程序。
SelectMany执行推迟到查询被实际“调用”为止。
代替.Subscribe()调用.ToArray()或.ToList()来执行SelectMany。那应该抛出异常。