我想尝试使用C#进行线程编程,我对C中的线程有一些了解。
所以我想问一下如果我想终止一个线程,我应该使用smt.Abort()
还是让它在函数结束后自动"kill itself"?
此外,在C#中是否有像C中的pthread_exit()
这样的东西?
我想尝试使用C#进行线程编程,我对C中的线程有一些了解。
所以我想问一下如果我想终止一个线程,我应该使用smt.Abort()
还是让它在函数结束后自动"kill itself"?
此外,在C#中是否有像C中的pthread_exit()
这样的东西?
Thread.Abort
方法会"强制终止"线程,但这相当于:
场景:您想关闭计算机。
解决方案:您在计算机上绑上炸药,点燃它,然后跑开。
更好的方法是通过触发“退出条件”来结束线程,例如使用CancellationTokenSource.Cancel
、设置某个(安全访问的)“正在运行”布尔值等,并调用Thread.Join
方法。这就像:
场景:您想关闭计算机。
解决方案:您单击开始按钮、选择关闭并等待计算机关机。
CancellationTokenSource
传递给 System.Threading.Thread
对象? - AaA一旦函数结束,您无需手动终止线程。
如果您启动一个线程来运行方法,则一旦该方法返回,线程将自动关闭,因为它没有其他要执行的内容。*
当然,您可以通过调用Abort()
手动中止线程,但这几乎不被推荐,因为可能会导致线程状态损坏,由于不可靠地确定线程在其当前执行状态中的位置。如果您需要处理线程的停止,可以考虑使用CancellationToken。您还可以阅读MSDN上的取消托管线程文章。
** 除非您正在使用线程池执行您的工作。您不必担心中止这些线程,因为它们在不同的排队任务之间重复使用。
CancellationToken
示例。 - Rudi VisserSystem.Threading.Thread
类中使用 CancellationToken
吗?它不会像静态布尔变量一样行为吗? - AaAThread.Abort()
Thread.Join();
Thread = null;
t1.Join(); t2.Join();
),则使用它 - 通常安排/运行线程的代码会使用这个方法。 - MattThread.Abort()
现已被弃用,不再起作用,曾经用于强制终止线程,无论它正在执行什么操作以及它仍然打开了哪些资源等。此外,代码的其余部分并不能终止一个线程。 - BasementScience