为什么以下未处理的异常不会使进程崩溃?

问题描述 投票:0回答:1

我在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运算符,该运算符以相同的方式严重崩溃了所使用的应用程序。

.net system.reactive unhandled-exception
1个回答
0
投票

SelectMany执行推迟到查询被实际“调用”为止。

代替.Subscribe()调用.ToArray()或.ToList()来执行SelectMany。那应该抛出异常。

© www.soinside.com 2019 - 2024. All rights reserved.