Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在计时器的回调方法中引发异常_C#_Exception_Timer_Backgroundworker_Multithreading - Fatal编程技术网

C# 在计时器的回调方法中引发异常

C# 在计时器的回调方法中引发异常,c#,exception,timer,backgroundworker,multithreading,C#,Exception,Timer,Backgroundworker,Multithreading,我在任何地方都找不到这个问题的答案 System.Threading.Timer的回调方法(或System.Timers.Timer的事件处理程序)中抛出的异常会发生什么情况。异常是否传播到创建计时器的线程,或者异常是否丢失 在计时器的回调函数中引发异常的副作用是什么 向计时器的创建线程发出工作线程(回调方法)中的异常已被抛出的信号的正确方式是什么 谢谢您的时间。我不知道最好的选择是什么,但是当我使用回调计时器时,我通常会抛出异常,让它们冒泡到主回调例程,在那里我会优雅地处理它们。线程继续在计时

我在任何地方都找不到这个问题的答案

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.
    }