Когда вызов метода находится в ожидании для COM-объекта на основе VFP (который всегда выполняется в квартире STA), вызов любого метода в этом же COM-объекте из другого потока будет блокироваться до тех пор, пока предыдущий вызов не вернется(выходит из квартиры).Это означает, что любой поток, пытающийся вызвать Destroy () одновременно, будет зависеть от этого первого потока.И если этот поток не знает, чтобы выйти добровольно, он теоретически может держать поток удаления заблокированным на неопределенный срок.Итак, другими словами, нет прямого способа попросить 1-й поток немедленно выйти из метода, вызвав другой метод в COM-объекте из другого потока.Вызов _vfpThread.Abort () должен работать, но безопасность этого подхода во многом зависит от внутренних особенностей класса VFP.Во многих случаях из-за того, что он является устаревшим кодом, он не будет иметь ничего общего с разделом try / catch / finally, который позволил бы обеспечить плавный выход, поэтому ресурсы могут остаться незамеченными.- ПЛОХО!
Другой подход - установить где-нибудь внешний флаг (реестр, файл и т. Д.), Который будет доступен для чтения этим первым потоком из метода, который он выполняет.Это, конечно, требует, чтобы класс VFP знал о необходимости считывать флаг из каждого из своих опубликованных COM-методов и действовать соответствующим образом и быстро.
Кроме того, в отношении вашего фрагмента кода.Перехват ThreadAbortException в коде, который прерывает поток, имеет смысл только в том случае, если поток, выполняющий этот код, прерывает сам себя.Что было бы довольно неловко, поскольку вместо этого он мог просто вернуться из метода.(Или этот поток, который вызывает _vfpThread.Abort (), также потенциально может быть прерван из еще одного потока?) В обычном сценарии то, что вам нужно заключить в ловушку ThreadAbortException, является основным кодом 1-го потока, который выполняет вызовы для всехэти бизнес-методы на объекте COM.В идеале это должно быть так же глубоко в стеке, как и у самих методов VFP, когда код сможет корректно закрыть все ресурсы / таблицы и т. Д. Перед повторным вызовом исключения.И затем в основном методе, который вы передали ThreadStart, у вас будет похожий перехватчик, за исключением того, что он мирно вернется из метода, тем самым завершив поток или выпустив его в пул потоков.