【问题标题】:Multiple threads with infinite loop and thread.sleep high CPU usage具有无限循环和 thread.sleep 高 CPU 使用率的多个线程
【发布时间】:2020-09-16 20:27:30
【问题描述】:

在我的控制台应用程序中,我有一些线程,每个线程都有一个带有 Thread.Sleep 的无限循环。 有很多线程,因为每个线程都独立于其他线程。 每个循环每waitingTime 时间运行一次,我希望它永远不会停止。

static int waitingTime= 5 * 60 * 1000;

static void Main(string[] args)
{
    Thread thread1 = new Thread(() => Thread1());
    Thread thread2 = new Thread(() => Thread2());
    Thread thread3 = new Thread(() => Thread3());
    ...
    thread1.Start();
    thread2.Start();
    thread3.Start();
    ...
}

static void Thread1()
{
      do
      {
          // Connect to DB and do something...
          try
          {
              using (SqlConnection connection = MyDBClass.MyDBConnection())
              {
                  connection.Open();
                  SqlCommand command = connection.CreateCommand();
                  command.CommandText = "SELECT x, y FROM Table WITH (NOLOCK);";
                  SqlDataReader sdr = command.ExecuteReader();
                  while (sdr.Read())
                  {
                      MyObject obj = new MyObject(sdr[0] as string, ...);
                      MyStaticClass.SetMyObject(obj); // Open a new DB connection on different server and do an Update.
                  }
                  sdr.Close();
                  sdr.Dispose();
              }
          }
          catch
          {
          }

          Thread.Sleep(waitingTime);
      }
      while (true);
 }

static void Thread2()
{
     do
     {
        // Connect to DB and do something...
        Thread.Sleep(waitingTime);
     }
     while (true);
 }

...

我已经读到在这种情况下使用 Thread.Sleep() 并不好,并且应该使用像 EventWaitHandle 这样的解决方案。 这种情况的最佳解决方案是什么以及如何实施。

【问题讨论】:

  • 您的用例不清楚。为什么你需要Thread.Sleep?为什么你认为EventWaitHandle 会帮助你?请详细说明。
  • 您是否使用多线程来提高性能?数据库访问最好通过异步而不是并行来解决。
  • 使用计时器并研究异步编程。创建线程然后让它们休眠是浪费资源......
  • @dymanoid Thread.Sleep 是让循环停止等待时间。使用EventWaitHandleAutoResetEvent可以释放CPU使用率吗?
  • @JohnathanBarclay 我使用多个线程来允许 Thread1()、Thread2() ... 代码独立于其他人运行。你能告诉我最好的方法是什么吗?

标签: c# multithreading timer console-application


【解决方案1】:

使用Thread.Sleep() 休眠的线程消耗的CPU 资源为零,因此尝试使用EventWaitHandle 原语或其他方式对此进行改进是没有意义的。你不能打败零。您可以改进的是线程消耗的 RAM,它们的堆栈为 1 MB,加上它们在堆上分配的内存(这取决于它们在工作时所做的事情)。因此,通过使用单个线程而不是三个线程,您可以将 RAM 消耗减少 2 MB 或更多,这对于在现代 PC 上运行的控制台应用程序来说几乎没有什么意义。所以我不会在你的位置上担心它。

【讨论】:

  • 嗨。有一段时间我的所有线程都处于睡眠状态,而我的 CPU 使用率约为 10%。你觉得有什么理由吗?
  • @Sponsor 他们唯一能想到的就是垃圾收集器在其专用线程中完成其工作。不过,对于 CPU 使用率延长 10% 似乎不是一个很好的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-30
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多