【发布时间】: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