【问题标题】:Why thread.IsAlive - thread.Abort() doesn't works? [closed]为什么 thread.IsAlive - thread.Abort() 不起作用? [关闭]
【发布时间】:2017-10-26 13:15:11
【问题描述】:

我正在尝试将我的线程发送为

private Thread thread;
. . .
if(thread != null && thread.IsAlive) thread.Abort();
. . .
thread = new Thread(myProcess);
thread.Start();

如果 myProcess 已经运行,则从一开始就重新开始。 但是,它永远不会出现在 thread.Abort() 中,而且 WPF UI 响应时间仍然很糟糕。

我怎样才能做到正确?

【问题讨论】:

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

标签: c# wpf multithreading


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2018-02-15
    • 2018-02-15
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多