必须允许委托线程完成
本文关键字:线程 许委托 | 更新日期: 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所示)。