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);
}

そのループ内で何もしていないため、シングル コアの CPU 使用率が 100% になっています。

マルチコア マシンでは、速度が大幅に低下する可能性がありますが、システム全体がロックアップすることはありません。システムで何か問題が発生している可能性があり、このプログラムによって引き起こされた熱またはシステム負荷により、コンピューターの他の部分が機能しなくなり、ロックアップが発生する可能性があります。

簡単な解決策は、CPUを解放するために何らかのスリープをそこに置くことです

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

またはさらに良いことに、ループ全体を次のように置き換えます

t.Wait();

しかし、あなたが行っていることは他にもたくさんありますが、それらは「適切でないコーディング手法」と見なされ、プログラム全体を書き直す必要がある可能性があります。

于 2013-10-11T16:10:56.227 に答える