必须允许委托线程完成

本文关键字:线程 许委托 | 更新日期: 2023-09-27 17:58:26

所以我通过以下方式从托管代码调用线程:

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

我已经注意确保这个类的析构函数等待线程完成。因此,在大多数正常情况下,允许线程在进程存在之前完成其工作。然而,我怀疑可能存在这样的情况(可能是其他线程上未处理的异常?),即不调用析构函数,并且线程在未被允许完成的情况下终止。

我该怎么办。在委托类或包装类中,以确保允许该线程完成,而不考虑其他线程中的异常、中止或退出?

我读过关于UnhandledExceptionHandler()的文章,但不确定该怎么处理。我想当这个处理程序被调用时,我的线程已经吐司了。我也可以在委托中放一个try/catch块,但这意味着线程已经被中断,无法执行当前操作。

我还认识到,根据所涉及的异常情况,整个应用程序环境可能是toast。所以即使我能抓住/阻止线程终止。我可能只应该给它30秒左右的时间来尝试完成它的工作,然后让它无论如何死去。

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

必须允许委托线程完成

我认为你这样做的方式应该是安全的,除非你的终结器(也称为析构函数)本身抛出异常。

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

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

UnhandledExceptionHandler()OnUnhandledException不适合温顺的人。

我认为您必须将对IAsyncResult ar的引用传递给类、方法或通过Interface访问器。这样,在您的异常处理程序中,您可以:

void DoSomething(IPriorityProcess priorityProcess)
{
    try
    {
        // stuff here
    }
    catch (Exception ex)
    {
        if (!priorityProcess.IsCompleted)
        {
            // wait here or whatever
        }
    }
}

我会使用:

try  
{ 
// Child thread code here
}   
catch ()  
{ // Catch child thread exceptions }  
finally  
{ ThreadIsComplete = true; }

在您的子线程中。从父线程向子线程传递对ThreadIsComplete标志的引用(或使用带锁的全局或其他),并在继续之前检查父线程中的标志(如@IAbstract所示)。