Несколько потоков с бесконечным l oop и высокой загрузкой процессора thread.sleep - PullRequest
0 голосов
/ 29 мая 2020

В моем консольном приложении у меня есть несколько потоков, и каждый поток имеет бесконечный l oop с 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 . Какое решение для этого случая лучше всего и как его реализовать.

1 Ответ

0 голосов
/ 29 мая 2020

Поток, который спит с Thread.Sleep(), потребляет нулевые ресурсы ЦП, поэтому попытки улучшить это с помощью EventWaitHandle примитивов или других средств бессмысленны. Вы не можете побить ноль. Что вы могли бы улучшить, так это объем оперативной памяти, потребляемой потоками, которая составляет 1 МБ для их стека, плюс память, которую они выделяют в куче (что зависит от того, что они делают во время работы). Таким образом, используя один поток вместо трех, вы можете уменьшить потребление оперативной памяти на 2 МБ или более, что для консольного приложения, работающего на современном P C, практически ничего не стоит. Так что на вашем месте меня бы это не беспокоило.

...