Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
.net 什么是挂线?_.net_Multithreading - Fatal编程技术网

.net 什么是挂线?

.net 什么是挂线?,.net,multithreading,.net,Multithreading,Thread.Abort()文档指出,如果出现以下情况,它将抛出ThreadStateException: 正在中止的线程当前已挂起 这究竟是什么情况 ,或等待 WaitHandle ,是否被认为是“暂停”?< /p> 从阅读文档中,我的解释是“暂停”在这个上下文中不涉及使用线程>睡眠< /代码>或 WaitHandle < /代码>用法,而是指在使用过时的或等效的Windows API时遇到的线程状态 在此上下文中,挂起线程是指其执行已被显式暂停(或挂起)的线程,即它的上下文不再被执行,但已挂

Thread.Abort()
文档指出,如果出现以下情况,它将抛出
ThreadStateException

正在中止的线程当前已挂起

这究竟是什么情况


<例如,如果线程位于<代码>线程中。睡眠(1000)< /代码>,或等待<代码> WaitHandle <代码>,是否被认为是“暂停”?< /p> 从阅读文档中,我的解释是“暂停”在这个上下文中不涉及使用<代码>线程>睡眠< /代码>或<代码> WaitHandle < /代码>用法,而是指在使用过时的或等效的Windows API时遇到的线程状态

在此上下文中,挂起线程是指其执行已被显式暂停(或挂起)的线程,即它的上下文不再被执行,但已挂起以在稍后某个点恢复

此技术主要由调试器使用,不建议用于同步活动。MSDN文件对此进行了澄清,内容如下:

此功能主要是设计的 供调试器使用。事实并非如此 拟用于螺纹 同步。调用SuspendThread 在拥有 同步对象,例如 互斥或临界段,可能导致 如果调用线程尝试,则会出现死锁 获取同步对象的步骤 由挂起的线程拥有


挂起的线程是由于调用而挂起的线程


有关线程可能处于的状态以及如何达到该状态的列表,请参见枚举。

在这方面,文档相当差
Thread.Abort
,虽然不建议使用,但在2.0及更高版本中更安全。它将安全地解除大部分.NET BCL阻止调用的锁定,包括
Thread.Sleep
WaitHandle.WaitOne
Monitor.Enter
,等等。我的解释是,在这个上下文中,挂起的含义是在其中一个调用中被阻塞的线程。我相信这可以用下面的代码来证明

static void Main(string[] args)
{
    var thread = new Thread(() => 
        {
            try
            {
                Console.WriteLine("Thread blocking");
                Thread.Sleep(Timeout.Infinite);
                Console.WriteLine("Thread unblocked");
            }
            catch (ThreadAbortException)
            {
                Console.WriteLine("ThreadAbortException");
            }
        });
    Console.WriteLine("Starting thread");
    thread.Start();
    Console.WriteLine("Waiting 1 second");
    Thread.Sleep(1000);
    Console.WriteLine("Aborting thread");
    thread.Abort();
    Console.WriteLine("Waiting for thread to end");
    thread.Join();
    Console.WriteLine("Thread ended");
    Console.ReadLine();
}
将对
Thread.Sleep
的调用替换为BCL中的其他阻塞调用,以查看
Thread.Abort可以“戳”哪些阻塞调用

更新

我原来的解释显然不正确。文档几乎明确地告诉您应该如何解释

如果对以下线程调用中止: 已经被暂停,一个 ThreadStateException在 调用中止的线程,以及 AbortRequested被添加到 线程的ThreadState属性 正在流产。线程异常 未在挂起的线程中抛出 直到调用Resume


我将继续并留下我的答案,因为它与问题无关。

我相信它指的是过时的。所以我猜这是你说普通等待、休眠或阻塞线程不算“挂起”的方式。但如果调试器挂起一个线程,然后另一个线程试图中止它。。。这可能会导致异常?@Qwertie:这是我对文档的解释,是的(调试器或其他使用“挂起”线程功能的应用程序)。我已经更新了我的答案以直接回答你的问题。谢谢。我想你的解释是错的。阅读
Thread.Abort
的文档时,“suspended”用于引用“Resume”,这一事实意味着,根据过时的
Thread.Suspend
处于挂起状态时,所描述的行为才会发生。是的,在仔细阅读之后,它确实被用于
Thread.Resume
的上下文中。我决定保留我的答案,因为我认为它在一定程度上准确地回答了问题的第二部分。我对文档的原始解释完全不正确…很抱歉误导了。嗯,有趣的-Abort()可以抛出ThreadStateException,但是挂起的线程在恢复时仍然会中止。即使方法仍然执行请求的操作(尽管在将来的某个未知点),从方法中获取异常也是很奇怪的+1用于播放:)