我发现this nice component名为TBackgroundWorker。但是,人们(在SO上)批评它,因为它使用TerminateThread。这是“错误的”代码:
destructor TBackgroundWorker.Destroy;
begin
if IsWorking then
begin
TerminateThread(fThread.Handle, 0);
Cleanup(True);
raise EBackgroundWorker.CreateFmt(SInvalidExit, [Name]);
end;
inherited Destroy;
end;
对我来说,这似乎是一个有效的析构函数。是吗?我要担心吗?
有更好的解决方案吗?
答案 0 :(得分:1)
我认为析构函数是有效的。
强行终止线程是错误的。同样,在析构函数中引发异常可能会杀死整个应用程序。但是,请不要忽略上下文。
我们谈论一个包装线程的代理对象。如果此类组件正在运行,则其破坏与杀死正在运行的线程相当。代理应该快速失败,并报告这种不当行为,而不要对其进行处理。此外,这是一个第三方组件,它不了解应用程序开发人员的意图。
我想你不同意我。否则,我们没有对话。让我们看看替代方案是什么。
正常执行任务并终止线程,没有异常消息。使用这种方法,我们正在猜测开发人员的意图。如果开发人员犯了一个错误,他或她可能永远不会知道,直到为时已晚。该应用程序将出现意外行为,并且找出问题的根源非常复杂。
无论如何都会忽略正在运行的线程并销毁组件,而不会引发异常。似乎就像将确定性计算机转变为非确定性计算机一样。我们甚至需要讨论这个问题吗?
仅引发异常。由于线程仍在运行,因此变量和堆栈跟踪可能包含误导性状态,这使调试更加困难。
我相信我们所有人都希望在开发的早期阶段发现错误,并为我们的客户提供可靠而稳定的应用程序。我们应该停止这样做,因为我们需要使用的工具没有有效的用例吗?
总有一个有效的用例。如果我错了,请启迪。