为什么空白线程占用CPU的30%?

Mar*_*rno 2 c# multithreading

我写了ac#console应用程序.

在启动之后,它会启动2个新线程,这些线程根本没有做任何重的事情,为什么这种情况会占用30%的CPU?

这是我的代码:

class Program
{
    static DateTime LastPlayerRegistration;
    static List<Player> Players;
    static List<string> CommandsList = new List<string>
    {
        "GetPlayersNumber", "GetLastRegistration", "GetTimeElapsed", "NewPlayer"
    };
    static void Main(string[] args)
    {
        if (!File.Exists("Players.json")) File.Create("Players.json");
        Players = JsonConvert.DeserializeObject<List<Player>>(File.ReadAllText("Players.json")) ?? new List<Player>();
        new Thread(PlayerInput).Start();
        new Thread(GeneralRoutines).Start();
    }

    static void PlayerInput()
    {
        while (true)
        {
            string command = Console.ReadLine();
            string[] commandParameters = command.Split(' ');
            switch (commandParameters[0].ToLower())
            {
                case "getplayersnumber":
                    Console.WriteLine("There are " + Players.Count + " players registered!");
                    break;
                case "getlastregistration":
                    Console.WriteLine("Last registration happened at " + LastPlayerRegistration);
                    break;
                case "gettimeelapsed":
                    Console.WriteLine((DateTime.Now - LastPlayerRegistration) + " time elapsed from last registration");
                    break;
                case "newplayer":
                    if (commandParameters.Count() > 1 && !string.IsNullOrEmpty(commandParameters[1]))
                    {
                        DateTime now = DateTime.Now;
                        TimeSpan elapsed = (now - LastPlayerRegistration);
                        LastPlayerRegistration = now;
                        Players.Add(new Player(commandParameters[1], elapsed));
                        Console.WriteLine("Player " + commandParameters[1] + " created!");
                    }
                    else
                    {
                        Console.WriteLine("Player Name is missing!");
                    }
                    break;
                default:
                    Console.WriteLine("'" + command + "' command is not defined.");
                    break;
            }
        }
    }

    static void GeneralRoutines()
    {
        DateTime lastPlayersListSave = DateTime.Now;
        while (true)
        {
            if ((int)(DateTime.Now - lastPlayersListSave).Seconds >= 30)
            {
                File.WriteAllText("Players.json", JsonConvert.SerializeObject(Players));
                Console.WriteLine("Players list saved!");
                lastPlayersListSave = DateTime.Now;
            }
        }
    }
}

class Player
{
    public Guid ID { get; set; }
    public string Name { get; set; }
    public TimeSpan Elapsed { get; set; }

    [JsonConstructor]
    public Player(Guid id, string name, TimeSpan elapsed)
    {
        this.ID = id;
        this.Name = name;
        this.Elapsed = elapsed;
    }
    public Player(string name, TimeSpan elapsed)
    {
        this.ID = Guid.NewGuid();
        this.Name = name;
        this.Elapsed = elapsed;
    }
}
Run Code Online (Sandbox Code Playgroud)

Pat*_*man 6

它启动了2个新线程,它们根本没有做任何重要的事情

嗯,我很确定它说while (true)会继续运行该代码,直到所有CPU电源都烧毁,并且在紧密的循环中它会不断分配(并最终释放)内存.没有什么可以阻止代码以尽可能快的速度运行,从而及时分配大量内存.

你应该延迟执行一点.例如,您可以使用a Thread.Sleep(1000)在"无操作"的情况下延迟执行一秒钟.

  • @MarcoSalerno:当你进入一个'while(true){donothing}循环时,你对处理器的期望是什么?你没有让他睡觉,等等,检查他是否无所事事,询问操作系统是否有任何其他事情要做,等等.它按照你的要求做了:它跑了循环. (4认同)
  • 显然重复循环,但我真的认为它不是那么沉重 (2认同)
  • @quetzalcoatl确实,它会继续执行代码.即使重复执行最小的语句也会导致100%的CPU负载.它只会比更长的陈述更频繁地运行. (2认同)
  • @MarcoSalerno将它视为汉堡包比赛:在给定的时间内尽可能多地吃.你需要更少的时间来买一个小汉堡包,但它们会让你一直忙着,直到时间结束.这就是你的代码对CPU的作用,无论多小. (2认同)
  • 重新"RAM":最有可能的事实是循环运行速度非常快,并且执行了很多String.Split,它们可以创建新的字符串和新数组.GC会清理它,但生产速度非常快 (2认同)
  • 我的坏想说CPU (2认同)
  • 实际上,我建议完全抛弃旋转等待.使用Timer可以轻松地每隔30秒将JSON保存到文件. (2认同)
  • @MarcoSalerno:那是另一个故事.或许多故事.有几种方法,并且,严重地,旋转,而(真实)是其中之一,并且它被使用了一些.然而,通常它并不是一直都在愚蠢地旋转.如果没有任务,服务器会一直睡眠,直到他们收到有关新任务的通知.查找并阅读有关单线程与多线程与服务器端请求的"异步"处理的信息.你会发现大量的材料和讨论. (2认同)