一个线程挂起

3
我开始学习线程,并编写了这个代码。
static void Main(string[] args)
{
    Thread DoAction = new Thread(StartAction);
    DoAction.Start();
    for (int i = 0; i < 10000000; i++)
    {
        Console.WriteLine("Main Thread: {0}", i);
        if (i == 10000) DoAction.Suspend();
    }
}

static void StartAction()
{
    for(int i=0;i<int.MaxValue;++i)
    {
        Console.WriteLine(i);
    }
}

当 i==10000 时,我的应用程序停止了。我想暂停只有 DoAction 线程。


1
这是一个过时的API,你不应该使用它。我建议你把时间花在研究那些没有被弃用的API上,或者更好的选择是使用更高级别的抽象,比如任务。 - Jon Skeet
谢谢。我会遵循你的建议。 - user3926523
1
您可以使用这种代码来了解线程的一般情况(这个问题是一个很好的例子),但Jon是正确的,这些任何内容都不应该出现在生产代码中。 - H H
2个回答

5

控制台是一个“线程安全”的类,这意味着访问是通过锁在内部进行调节的。

如果运气不好,你可能会在WriteLine()的中间挂起工作线程。 然后当主线程尝试写入时,它就被放置在等待状态,从而导致死锁。


3

Thread.Suspend 几乎总是不安全的。在这里,您可能会暂停整个控制台。想象一下,如果您意外地暂停了 system.string 的静态构造函数,整个 AppDomain 将很快停止。

使用其他手段来同步您的线程。


我会期望这样一个特殊的构造函数被特别对待(作为受保护的区域或其他什么)。但你的观点是正确的。 - H H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接