C# 异常无限重复,使用Rx

C# 异常无限重复,使用Rx,c#,system.reactive,unhandled-exception,C#,System.reactive,Unhandled Exception,当前我的应用程序捕获未处理的异常,如下所示: AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; Application.Current.DispatcherUnhandledException += Current_DispatcherUnhandledException; TaskScheduler.UnobservedTaskException += TaskScheduler_Un

当前我的应用程序捕获未处理的异常,如下所示:

AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
Application.Current.DispatcherUnhandledException += Current_DispatcherUnhandledException;
TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
尽管如此,当异常发生时,它是这样的(例如):

异常会无限重复自身(在调试中)。 尽管处于发布模式或不在visual studio中,但应用程序已完成(AppDomain.CurrentDomain.UnhandledException的标准行为)
如何避免或改变这种行为


我的目标是只运行代码一次。无论是否发生异常,这都是独立的。要求之一是由计时器触发。
其他内容..如果存在异常,则应由DispatcherUnandledException或UnobservedTaskeException或类似程序处理(这会阻止我为每个订阅和关闭应用程序编写try-catch)

您的代码会触发
AppDomain.CurrentDomain.UnhandledException
,从而终止.NET 2.0及更高版本的应用程序执行。如果在Visual Studio中调试该代码,您会反复收到未经处理的异常通知

在.NET Framework版本1.0和1.1中,未经处理的异常 在主应用程序线程以外的线程中发生的 被运行时捕获,因此不会导致应用程序 终止。因此,可以终止未处理的异常事件 在应用程序终止的情况下引发。在.NET Framework中 版本2.0,该版本支持子线程中未处理的异常 因为这种无声故障的累积效应 包括性能下降、数据损坏和锁定,所有这些 很难调试。有关更多信息,包括列表 对于运行时未终止的情况,请参阅中的异常 托管线程

有关详细信息,请参阅文档

对于那些好奇的人,这里是堆栈跟踪(对于.NET3.5和反应式扩展版本1.0.10621.0):

System.Exception:引发了类型为“System.Exception”的异常。
在path\MainWindow.xaml.cs:XX行中的yournamespace.MainWindow.b__0(Int64 r)中
at System.Reactive.AnonymousObserver`1.Next(T值)
at System.Reactive.AbstractObserver`1.OnNext(T值)
at System.Reactive.AnonymousObservable`1.AutoDetachObserver.Next(T值)
at System.Reactive.AbstractObserver`1.OnNext(T值)
在System.Reactive.Linq.Observable.c_uuuDisplayClass2FF`1.c_uuuDisplayClass301.b_uuu2FE(t源x)
at System.Reactive.AnonymousObserver`1.Next(T值)
at System.Reactive.AbstractObserver`1.OnNext(T值)
at System.Reactive.AnonymousObservable`1.AutoDetachObserver.Next(T值)
at System.Reactive.AbstractObserver`1.OnNext(T值)
at System.Reactive.Linq.Observable.c__显示类35b.c__显示类35d.b_35a()
在System.Responsive.Concurrency.Scheduler.Invoke(isScheduler Scheduler,Action Action)
在System.Responsive.Concurrency.ThreadPoolScheduler.c__DisplayClass5`1.b__3(对象)
在System.Threading.ExecutionContext.Run(ExecutionContext ExecutionContext,ContextCallback回调,对象状态)
在System.Threading.\u TimerCallback.PerformTimerCallback(对象状态)

异常说明了什么..我怀疑如果有一个计时器控件,该控件是可观察的.Timer(TimeSpan.Zero).Do代码将在一定的时间间隔内触发..粘贴异常请使用基本数学任何除以0=0的内容,但在代码中会产生一个除以零的异常点是:the.Take(1)不受尊重,我更新了我的问题..无论thrownObservable.Timer出现什么异常(DateTimeOffset.MinValue,TimeSpan.FromSeconds(1));这对你有用吗。?我真的搞不清楚你想做什么..你能用不同的方式使用Observable.Timer而不是作为Labda吗?如果我没有弄错的话,它会因为你的=>{Trace.WriteLine(“订阅”);throw new Exception();//simulation..}而不断抛出异常;也许我对你的预期结果感到困惑。。你能试着重新表述你的问题吗?谢谢你的帮助。我混淆了“DispatcherUnhandledException”和“CurrentDomain.UnhandledException”
        TimeSpan toExecute = AnyMethod();
        Observable.Timer(toExecute).Take(1).Subscribe((r) =>
        {
            Trace.WriteLine("Subscribe");
            throw new Exception(); // simulation..
        });
System.Exception: Exception of type 'System.Exception' was thrown.

   at yournamespace.MainWindow.<Button_Click>b__0(Int64 r) in path\MainWindow.xaml.cs:line XX
   at System.Reactive.AnonymousObserver`1.Next(T value)
   at System.Reactive.AbstractObserver`1.OnNext(T value)
   at System.Reactive.AnonymousObservable`1.AutoDetachObserver.Next(T value)
   at System.Reactive.AbstractObserver`1.OnNext(T value)
   at System.Reactive.Linq.Observable.<>c__DisplayClass2ff`1.<>c__DisplayClass301.<Take>b__2fe(TSource x)
   at System.Reactive.AnonymousObserver`1.Next(T value)
   at System.Reactive.AbstractObserver`1.OnNext(T value)
   at System.Reactive.AnonymousObservable`1.AutoDetachObserver.Next(T value)
   at System.Reactive.AbstractObserver`1.OnNext(T value)
   at System.Reactive.Linq.Observable.<>c__DisplayClass35b.<>c__DisplayClass35d.<Timer>b__35a()
   at System.Reactive.Concurrency.Scheduler.Invoke(IScheduler scheduler, Action action)
   at System.Reactive.Concurrency.ThreadPoolScheduler.<>c__DisplayClass5`1.<Schedule>b__3(Object _)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading._TimerCallback.PerformTimerCallback(Object state)