0

我有以下代码示例:

class Program
{
    static void Main(string[] args)
    {
        var a = true;
        Task t = Task.Factory.StartNew(() =>
        {
            a = getBoolean();
        });
        Task.Factory.StartNew(() =>
        {
            Console.ReadLine();
        });
        while (!t.IsCompleted)
        {
            //Console.WriteLine("initial : a = {0}", a);
        }
        if (a == true)
        {
            Console.WriteLine("From system a = {0}", true);
        }
        else
        {
            Console.WriteLine("From system a = {0}", false);
        }
    }

    public static bool getBoolean()
    {
        Task<bool> a = DelayTask();
        bool r = a.Result;
        a.Dispose();
        return r;
    }

    public static Task<bool> DelayTask()
    {
        return Task.Factory.StartNew<bool>(() =>
        {
            Thread.Sleep(30000);
            return false;
        });
    }
}

一旦我在我的窗口上方运行此代码,就会自动死机。(我必须按笔记本电脑上的电源按钮)。有人可以帮我重现这个问题并解释为什么会发生这种情况。

4

1 回答 1

0

问题来自

while (!t.IsCompleted)
{
    //Console.WriteLine("initial : a = {0}", a);
}

您在该循环中什么也不做,它会导致 100% 的单核 CPU 使用,如果您在单核机器上,这很可能会导致它锁定。

在多核机器上,它可能会导致显着缓慢,但不应导致整个系统锁定。您的系统可能出现其他问题,并且此程序引起的热量或系统负载可能会导致计算机的其他部分出现故障,从而导致锁定。

快速解决方案是在其中放置某种睡眠以释放 CPU

while (!t.IsCompleted)
{
    Thread.Sleep(100); //Sleep for 100ms for the next check
}

甚至更好,将整个循环替换为

t.Wait();

但是,您正在做的许多其他事情被认为是“不好的编码实践”,整个程序可能需要重新编写。

于 2013-10-11T16:10:56.227 回答