C# 为什么thread.IsAlive-thread.Abort()不';不管用?

C# 为什么thread.IsAlive-thread.Abort()不';不管用?,c#,wpf,multithreading,C#,Wpf,Multithreading,我正试图将我的线程作为 private Thread thread; . . . if(thread != null && thread.IsAlive) thread.Abort(); . . . thread = new Thread(myProcess); thread.Start(); 如果myProcess已经运行,请从头开始。 然而,它从未出现过thread.Abort(),WPF UI响应时间仍然非常糟糕 我怎样才能做到正确呢?因此,在我帖子中的所有对话以及Sta

我正试图将我的线程作为

private Thread thread;
. . .
if(thread != null && thread.IsAlive) thread.Abort();
. . .
thread = new Thread(myProcess);
thread.Start();
如果myProcess已经运行,请从头开始。 然而,它从未出现过thread.Abort(),WPF UI响应时间仍然非常糟糕


我怎样才能做到正确呢?

因此,在我帖子中的所有对话以及StackOverflow之外的讨论中,我发现,我问的是一个非常基本的问题,其中没有任何解决方案的是Microsoft Windows体系结构:

当外部任务在带有API的某个线程中启动并正在运行时,无法取消此执行,并将其返回到初始挂起状态,但另一个API(在ProgressBar中称为“cancel”)专门用于将其返回到等待的空闲循环

在其他分时操作系统中,存在这样一个特殊点,但在Windows中不存在。 因此,当没有描述Cancel API接口时,我们应该从tread池运行另一个线程(可能),以节省系统中的CPU时间,并保持等待,直到完成不必要的线程

Tekla开发商的回复证实了我的结论:
“此类方法不存在。正如我之前所写,在应用程序中实现多线程无法提高性能,因为TeklaStructures内部代码不使用它。”

这些方法确实有效。如果UI线程阻塞,那是因为其他东西正在阻塞它。为什么要使用这样的原始线程呢?为什么不使用任务运行和协作取消?即使使用线程,
Abort
也被认为是一个非常糟糕的主意。“我怎样才能使它正确?”-开始。检查。这些类并不特定于异步操作,它们可以很容易地用于原始线程。“只是”使用
Task.Run
而不是线程要容易得多。它还可以理解取消,因此即使发出取消信号,任务也不会启动。除非您试图从应用程序中崩溃,否则永远不要调用
Thread.Abort()
。中止线程会使.NET运行时处于无效状态。换句话说,如果调用
Thread.Abort()
,则必须立即退出应用程序。@PavelKhrapkin这不是一个很长的计算过程。没有线程要中止,这是一个不同的进程。您正在使用COM自动化启动另一个应用程序。你不需要一个单独的线程来做这件事。这就是你想做的吗?是否通过中止其线程来停止Excel?这就是您的外部资源和跨线程问题。COM对象只能由创建它们的线程使用。中止线程也不意味着进程死亡。最终可能会有多个Excel实例在后台运行