C# 必须允许委托线程完成

C# 必须允许委托线程完成,c#,multithreading,exit,C#,Multithreading,Exit,因此,我通过以下方式从托管代码调用线程: Action<EFScmTechnologiesContext, long, long> updateReference = UpdateReferenceBaseline; IAsyncResult ar = updateReference.BeginInvoke(_context, baseline.Id, updatedBaseline.Id, null, null); Action updateReference=UpdateR

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

 Action<EFScmTechnologiesContext, long, long> updateReference = UpdateReferenceBaseline;
 IAsyncResult ar = updateReference.BeginInvoke(_context, baseline.Id, updatedBaseline.Id, null, null);
Action updateReference=UpdateReferenceBaseline;
IAsyncResult ar=updateReference.BeginInvoke(_context,baseline.Id,UpdatedB基线.Id,null,null);
我已经注意确保这个类的析构函数等待线程完成。因此,对于大多数正常情况,允许线程在进程存在之前执行其工作。但是,我怀疑可能存在这样的情况(可能是其他线程上未处理的异常?),即没有调用析构函数,并且线程在未被允许完成的情况下被终止

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

我读过UnhandledExceptionHandler(),但不确定该如何处理它。我想,当处理程序被称为我的线程时,它已经过时了。我还可以在委托中放置一个try/catch块,但这意味着线程已经中断了当前的操作

我还认识到,根据所涉及的异常情况,整个应用程序环境可能会被破坏。因此,即使我可以捕获/阻止线程终止。我大概应该只给它30秒左右的时间来完成它的工作,然后让它死掉


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

UnhandledExceptionHandler()
OnUnhandledException
不适合温顺的人

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

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

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

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

var thread = new Thread(() => UpdateReferenceBaseline(_context, baseline.Id, updatedBaseline.Id, null, null));
thread.Start();
我将使用:

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

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

我想到了一个
线程委托
。。。但是,您确定
IsBackground
属性吗?我知道它是
高于正常的
高于正常的
是一个优先级,它与线程是否是背景无关。线程的默认优先级是
Normal
。。。。doh!!!我已经很久没有和线程代理打交道了。。。这就是我决定不走那条路的原因…:)所以你让我用谷歌搜索。如果代理默认为前台线程,则此处“无问题”。我的经验告诉我这些线程提前终止。虽然情况很复杂,而且很难确定这是一个线程问题。谢谢你的信息。让我再挖一点。我看着最后的结果。没有背景。而底层的线程对象似乎被隐藏了。更深入的挖掘。@Frank,如果你显式地创建一个新的
线程
,它就不是后台线程。大多数其他异步执行方式(
BeginInvoke()
BackgroundWorker
Task
,使用默认调度程序或
ThreadPool
)使用共享后台线程池,因此它们不会公开任何使其不成为后台线程的方法。您的意思是他应该将代码放在
try
块中,或者您的意思是使用空的
try
块和空的
catch
块?因为那就等于根本不使用它们。