所以我以这种方式从托管代码中调用线程:

 Action<EFScmTechnologiesContext, long, long> updateReference = UpdateReferenceBaseline;
 IAsyncResult ar = updateReference.BeginInvoke(_context, baseline.Id, updatedBaseline.Id, null, null);

我已确保确保此类的析构函数等待线程完成。因此,对于大多数普通情况,允许线程在进程存在之前完成其工作。但是,我怀疑在某些情况下(可能是其他线程上未处理的异常?),没有调用析构函数,并且在不允许线程完成的情况下终止了该线程。

我需要做什么 。 。 。是否在委托(delegate)类或包装器类中,以确保无论异常如何都允许该线程完成,在另一个线程中中止或退出?

我读到有关UnhandledExceptionHandler()的信息,但不确定该如何处理。 。 。我认为在调用处理程序时,我的线程已经是吐司了。我还可以在委托(delegate)中放置一个try/catch块,但这意味着该线程已被中断执行其当前操作。

我还认识到,根据所涉及的异常情况,整个应用程序环境可能是敬酒的。 。 。因此,即使我可以捕获/阻止线程的终止。 。 。我可能只应该等待30秒钟左右才能尝试完成其工作,然后不管它死了。 。 。

我看到了很多有关线程和一般异常的信息,等等。 。 。但很少涉及“退出”流程以及该流程生命的最后时刻。 。 。如果有人有一个很好的描述的指针,请。 。 。

最佳答案

我认为您执行此操作的方法应该是安全的,除非您的终结器(也称为析构函数)本身抛出异常。

但是我不建议您这样做。更好的方法是为您的方法创建一个新线程。除非您更改Thread.ISBackground property,否则不会将其创建为后台线程,这意味着整个程序将继续运行,直到该线程停止:

var thread = new Thread(() => UpdateReferenceBaseline(_context, baseline.Id, updatedBaseline.Id, null, null));
thread.Start();

09-18 14:39