Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#线程终止和线程中止()_C#_.net_Multithreading - Fatal编程技术网

C#线程终止和线程中止()

C#线程终止和线程中止(),c#,.net,multithreading,C#,.net,Multithreading,在MSDN中,Thread.Abort()方法的描述是:“调用此方法通常会终止线程。” 为什么不总是 在哪些情况下,它不会终止线程 是否存在终止线程的其他可能性 为什么不总是? 在哪些情况下,它不会终止线程 对于初学者来说,线程可能会捕获一个线程并取消其自身的终止。或者,当您试图中止计算时,它可能会执行一个耗时很长的计算。因此,运行时不能保证线程总是在您请求它终止后终止 还有更多: 当调用Abort方法销毁线程时,公共语言运行库抛出ThreadAbortException。ThreadAbort

在MSDN中,Thread.Abort()方法的描述是:“调用此方法通常会终止线程。”

为什么不总是

在哪些情况下,它不会终止线程

是否存在终止线程的其他可能性

为什么不总是? 在哪些情况下,它不会终止线程

对于初学者来说,线程可能会捕获一个线程并取消其自身的终止。或者,当您试图中止计算时,它可能会执行一个耗时很长的计算。因此,运行时不能保证线程总是在您请求它终止后终止

还有更多:

当调用Abort方法销毁线程时,公共语言运行库抛出ThreadAbortException。ThreadAbortException是一个可以捕获的特殊异常,但它将在catch块结束时自动再次引发。当引发此异常时,运行库在结束线程之前执行所有finally块由于线程可以在finally块中执行无界计算,或者调用
thread.ResetAbort()
取消中止,因此不能保证线程会结束。


您不需要手动
Abort()
a线程。如果您只是让线程中的方法返回,CLR将为您完成所有脏活;这将正常结束线程。

我遇到过线程太忙而听不到Abort()调用的情况,这通常会导致ThreadAbortingException被抛出到我的代码中。

如果线程持有锁并被中止/终止怎么办?资源仍然处于停滞状态

当线程调用时,它可以正常工作 中止自身,但不由其他线程中止。 中止,强制终止 受影响的线程,即使它没有 已完成其任务,并且未提供任何 清理垃圾的机会 资源

参考文献


请参阅:

Thread.Abort()
在线程上注入
ThreadAbortException
。线程可以通过调用
thread.ResetAbort()
来取消请求。此外,还有某些代码部分,如
finally
块,将在处理异常之前执行。如果由于某种原因,线程卡在这样的块中,那么线程上永远不会引发异常


由于调用
Abort()
时,调用方对线程的状态几乎没有控制权,因此通常不建议这样做。将消息传递给请求终止的线程

OT:关于并发的全面的、语言不可知的、令人质疑的有用的和该死的有趣的理解,请参见

线程中止不会发生在finally块内部或介于和之间,因为您可以捕获
ThreadAbortException
并在处理程序内部调用
Thread.ResetAbort

在哪些情况下,它不会终止线程

这个问题是重复的

还有其他终止线程的可能性吗

对。你的问题是,你永远不应该启动一个线程,你不能礼貌地告诉停止,它会及时停止。如果您必须启动一个线程,而该线程可能(1)难以停止,(2)存在错误,或者最糟糕的是(3)对用户怀有敌意,那么正确的做法是创建一个新进程,在新进程中启动该线程,然后在希望线程停止时终止该进程。唯一能保证不合作线程安全终止的是操作系统停止其整个进程

有关更多详细信息,请参见我对该问题的过长回答:


相关的位是最后一位,我在这里讨论了在中止线程之前,线程应该等待多长时间才能终止它的注意事项。

FileStream.Read()
到当前未接收任何内容的命名管道(在等待传入数据时读取调用块)将不响应
线程.Abort()
。它保留在
Read()
调用中。

我似乎无法中止卡在循环中的线程:

//immortal
Thread th1 = new Thread(() => { while (true) {}});
但是,如果在循环期间休眠,我可以中止线程:

//mortal
Thread th2 = new Thread(() => { while (true) { Thread.Sleep(1000); }});

我确实需要中止()它,因为该线程上启动了一个消息循环(Dispatcher.Run();)。如果我理解正确,我需要调用一个调用return的方法到线程中来完成它?什么类型的消息?你是说方法调用吗?这取决于线程之间如何传递数据。例如,如果你的线程是一个带有任务队列的工作线程,你可以将一条令人愉快的消息排入队列,让线程优雅地处理它。我的线程有一个大问题需要解决,那就是没有任务队列。正如我所说,这取决于你的线程代码是如何设计的。也许你可以通过一个成员变量发出信号。如果没有可用的实际代码,就很难说得更具体。Eric,如果某个线程正在等待同步对象(例如EventWaitHandle.WaitOne();),我应该如何礼貌地告诉该线程停止@Corvin:两个线程之间描述一个线程如何与另一个线程通信的契约取决于在这些线程上运行的代码的作者。如果您有这样的需求:(1)线程X必须永远等待对象,(2)线程Y必须能够在有限的时间内完全关闭线程X,那么我认为您有相互矛盾的需求;决定谁赢。如果是前者,那么线程Y将不得不等待。如果是后者,那么线程X不应该永远等待,它应该等待一小段时间。感谢您的回答。考虑下面的体系结构:我有一个应用程序,当某个系统范围的事件发生时,它必须最小化它自己。我在该应用程序中有一个线程,它等待一个全局命名事件,并在设置该事件时执行其工作。另一方面,我的应用程序可能必须在