Предпочтительным способом является изменение кода, чтобы он не блокировался без проверки на отмену.
Поскольку вы не можете изменить код, вы не можете этого сделать; вам либо придется жить с фоновой операцией (но вы можете отсоединить ее от любого пользовательского интерфейса, чтобы ее завершение было проигнорировано); или, альтернативно, вы можете попытаться прекратить его (TerminateThread API грубо прекратит работу любого потока, учитывая его дескриптор). Прекращение не является чистым, хотя, как говорит Роб, любые блокировки, удерживаемые потоком, будут отменены, и любое состояние перекрестного потока, защищенное такими блокировками, может быть повреждено.
Можете ли вы назвать вызов функции в отдельном исполняемом файле? Возможно, используя RPC (каналы, TCP, а не разделяемую память из-за той же проблемы блокировки), чтобы вы могли завершить процесс, а не завершить поток? Изоляция процесса даст вам гораздо больше защиты. Пока вы не полагаетесь на кросс-процессные именованные вещи, такие как мьютексы, это должно быть намного безопаснее, чем уничтожение потока.