多线程无限循环和线程睡眠,CPU使用率高

问题描述 投票:0回答:1

在我的控制台应用程序中,我有一些线程,每个线程都有一个无限循环,有一个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.这种情况下最好的解决方案是什么,如何实现。

c# multithreading timer console-application
1个回答
0
投票

一个线程的睡眠与 Thread.Sleep() 消耗的CPU资源为零,所以试图用 EventWaitHandle 基元或其他手段是没有意义的。你无法战胜零。你可以改善的是线程所消耗的RAM,这就是 1 MB 的堆栈,再加上他们在堆上分配的内存(这取决于他们在工作时做什么)。因此,通过使用一个线程而不是三个线程,你可以减少2 MB或更多的内存消耗,这对于一个在现代PC上运行的控制台应用程序来说几乎不算什么。所以在你那里我不会担心这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.