17

我想在 C# 线程中试试运气,我知道一些关于 C 线程的事情。

所以我只想问我是否想终止一个线程,我应该这样做smt.Abort() 还是在函数结束后它会“自杀”?

另外, pthread_exit()C#中是否有类似C的东西?

4

4 回答 4

75

Thread.Abort将“杀死”线程,但这大致相当于:

场景:你想关掉你的电脑

解决方案:你把炸药绑在你的电脑上,点燃它,然后跑。

最好通过CancellationTokenSource.Cancel设置一些(安全访问的)“正在运行”布尔等来触发“退出条件”,然后调用Thread.Join. 这更像是:

场景:你想关掉你的电脑

解决方法:你点击开始,关机,等到电脑关机。

于 2013-01-03T01:07:39.490 回答
7

函数结束后,您无需手动终止线程。

如果你创建一个线程来运行一个方法,一旦方法返回,线程将自动关闭,因为它没有任何进一步的执行。*

当然,您可以通过简单地调用手动中止线程Abort(),但由于无法可靠地确定线程在其当前执行状态中的位置,可能会导致线程状态损坏,因此几乎不建议这样做。如果您需要自己处理线程的终止,您最好考虑使用CancellationToken。您还可以阅读 MSDN 上的Cancellation of Managed Threads文章。

** 也就是说,除非您使用 ThreadPool 来执行您的工作。您不必担心中止这些线程,因为它们会在不同的队列任务中重复使用。

于 2013-01-03T00:58:20.050 回答
4

从外部(从线程外部)终止线程是一个坏主意;当你异步杀死它时,你永远不知道线程在做什么。在 C# 中,如果您的线程函数返回,则线程结束。

这篇 MSDN 文章How to: Create and Terminate Threads (C# Programming Guide)有一些注释和一些示例代码,您可能会发现它们很有帮助。

于 2013-01-03T00:57:53.113 回答
0
Thread.Abort()
Thread.Join();
Thread = null;
于 2013-01-03T01:43:05.723 回答