C# 在计时器的回调方法中引发异常
我在任何地方都找不到这个问题的答案 System.Threading.Timer的回调方法(或System.Timers.Timer的事件处理程序)中抛出的异常会发生什么情况。异常是否传播到创建计时器的线程,或者异常是否丢失 在计时器的回调函数中引发异常的副作用是什么 向计时器的创建线程发出工作线程(回调方法)中的异常已被抛出的信号的正确方式是什么C# 在计时器的回调方法中引发异常,c#,exception,timer,backgroundworker,multithreading,C#,Exception,Timer,Backgroundworker,Multithreading,我在任何地方都找不到这个问题的答案 System.Threading.Timer的回调方法(或System.Timers.Timer的事件处理程序)中抛出的异常会发生什么情况。异常是否传播到创建计时器的线程,或者异常是否丢失 在计时器的回调函数中引发异常的副作用是什么 向计时器的创建线程发出工作线程(回调方法)中的异常已被抛出的信号的正确方式是什么 谢谢您的时间。我不知道最好的选择是什么,但是当我使用回调计时器时,我通常会抛出异常,让它们冒泡到主回调例程,在那里我会优雅地处理它们。线程继续在计时
谢谢您的时间。我不知道最好的选择是什么,但是当我使用回调计时器时,我通常会抛出异常,让它们冒泡到主回调例程,在那里我会优雅地处理它们。线程继续在计时器上运行
线程(System.Threading.Timer)中未处理的异常将停止整个程序。该异常不会传回调用线程。如果需要,您可以添加一个
catch
块,并找到一种向调用线程发送信号的方法。如果调用线程是WinForms或WPF UI线程,则可以使用该类将调用传递给UI线程。否则,您可以使用线程安全队列(或同步锁)并在另一个线程中定期检查它
System.Timers.Timer
将默默地吞下异常并继续计时(尽管这可能会在框架的未来版本中发生更改)System.Threading.Timer
将终止程序。我不知道这是否是最好的解决方案,但我所做的只是一个小的解决方法。我的调用线程已订阅一个事件,用于捕获线程间的异常。所以,当异常发生在某个线程中时,比如在TimeRecursed事件中,然后形成catch块,我将事件传递异常对象作为事件的参数
EventHolderCallingClass:它必须定义委托和事件,如下所示
public class EventHolderCallingClass
{
public delegate void HandleExceptionEventDelegate(Exception exception);
public event HandleExceptionEventDelegate HandleExceptionEvent ;
void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
try
{
//some operation which caused exception.
}
catch(Exception exception)
{
if(HandleExceptionEvent!=null)
HandleExceptionEvent(exception)
}
}
}
事件处理程序类(异常处理程序):
根据我在Windows10Framework4.6下的简单测试,SystemTimers.Timer Appeased事件使用的线程不会传播未处理的异常。
我需要向主线程触发一个事件,以通知发生了未处理的异常。+1以获取使用哪个计时器的建议。我一直在寻找我的
InvalidCastException
导致我的应用程序崩溃而不是捕获异常的原因。因此,在使用System.Threading.Timer时,除了在try-catch块中使用整个调用函数外,我们无法处理它们?@MonsterMMORPG:正确。如何传输异常对象
通过CustomEventArgs
class?
public EventHandlerClassConstructor()
{
EventHolderCallingClass.HandleExceptionEvent += new EventHolderCallingClass.HandleExceptionEventDelegate(HandleExceptionEventHandler);
}
void HandleExceptionEventHandler(Exception exception)
{
//handle exception here.
}