C# 当一堆线程都有一个线程时,我如何在x时间内运行它们?

C# 当一堆线程都有一个线程时,我如何在x时间内运行它们?,c#,multithreading,C#,Multithreading,完整说明: 在每个线程上运行Thread.Sleep似乎会阻止计时器的ElapsedEventHandler每隔x次调用Timer\u persed(FixedThreads),从而导致它打印线程的速度过快。我的目标是让ScheduleThreads每15秒启动一次FixedThreads(打印线程信息),即使某些线程没有按时完成执行/睡眠 using FT = FixedThreads.FixedThreads; using Timer = System.Timers.Timer; name

完整说明:

在每个线程上运行
Thread.Sleep
似乎会阻止计时器的
ElapsedEventHandler
每隔x次调用
Timer\u persed
(FixedThreads),从而导致它打印线程的速度过快。我的目标是让ScheduleThreads每15秒启动一次FixedThreads(打印线程信息),即使某些线程没有按时完成执行/睡眠

using FT = FixedThreads.FixedThreads;
using Timer = System.Timers.Timer;

namespace ScheduledThreads
{
  class ScheduledThreads
  {
    static void Main(string[] args)
    {
      var timer = new Timer(15000);
      timer.Elapsed += new ElapsedEventHandler(Timer_Elapsed);
      timer.Enabled = true;

      while (timer.Enabled)
      {        
        var info = Console.ReadKey(true);
        if (info.KeyChar == 'e')
        {
          timer.Enabled = false;
        }
      }
    }

    static void Timer_Elapsed(object sender, ElapsedEventArgs e)
    {
      FT.Main(null);
    }
  }
}
我在ScheduledThreads中调用FixedThreads

  public class FixedThreads
  {
    public static void Main(string[] args)
    {
      Random random = new Random();
      ThreadPool.SetMinThreads(100, 100);

      for (int task = 0; task < 1000; task++)
      {
        ThreadPool.QueueUserWorkItem(new WaitCallback(Execute), task);
        Thread.Sleep(random.Next(5, 801)); //this prevents schedule to work if there's more than 10-15 threads/tasks
      }
    }

    static void Execute(object callback)
    {
      Console.WriteLine($"Thread Id: {Thread.CurrentThread.ManagedThreadId}");
      Thread.CurrentThread.Name = callback.ToString();
      Console.WriteLine($"Thread Name: {Thread.CurrentThread.Name}");
      Console.WriteLine($"Daemon/Background Thread: {Thread.CurrentThread.IsBackground}");
    }
  }
公共类固定线程
{
公共静态void Main(字符串[]args)
{
随机=新随机();
SetMinThreads(100100);
对于(int task=0;task<1000;task++)
{
QueueUserWorkItem(新的WaitCallback(执行),任务);
Thread.Sleep(random.Next(5801));//如果有超过10-15个线程/任务,这将阻止调度工作
}
}
静态void执行(对象回调)
{
WriteLine($“线程Id:{Thread.CurrentThread.ManagedThreadId}”);
Thread.CurrentThread.Name=callback.ToString();
WriteLine($“线程名称:{Thread.CurrentThread.Name}”);
WriteLine($“守护进程/后台线程:{Thread.CurrentThread.IsBackground}”);
}
}

您可能正在运行默认线程池的最大线程数。它是处理
计时器的默认线程池


Thread.Sleep
会阻塞线程,通常是一种懒惰的方式来获取真正想要的东西。有更好的调度方法,它们不会阻塞线程,也不会像线程那样沉重。

您是否从控制台看到任何输出?否则,在线程可以写入控制台输出流之前,您可能会死锁,等待Console.ReadKey完成。这是因为Console.WriteLine和Console.ReadKey都获得了对同一对象的锁


Console.WriteLine仅在第一次输出到流时获得锁,因此一种简单的测试方法是在执行ReadKey之前添加一个Console.WriteLine。

不清楚您在原始帖子中尝试执行的操作;对于一个最小的测试来说,这似乎很复杂,但在其他方面却毫无意义。@Charlie我创建了FixedThreads来运行多个线程,同时显示它们的信息,并安排线程每隔x个时间启动这些线程。除非这是某种赋值,否则我95%肯定你这样做是错误的。除非您真的知道自己在做什么,否则不应该使用低级线程。使用
任务
对象和
异步
。而且,我怀疑你真的需要那么多的线程。如果您只是试图在后台运行东西,那么您可能应该只有1-2个线程和一个队列或
BlockingCollection
,其中包含您希望发生的事情。@mjwills它完全忽略了线程。在Execute函数中休眠。不,它不是(如果您将
Thread.Sleep(random.Next(5801));
执行方法的开头)。有1000个线程都在随机延迟。其中一些持续8毫秒(即几乎立即)。有些时间为800毫秒(即快速,但不是瞬间)。写入控制台的速度相对较慢,因此在您看来似乎没有延迟。但是有一个延迟。结果是,您的1000个线程都在以一种模式延迟,看起来没有延迟。你的大脑无法真正区分“无延迟”和“8毫秒”。它们看起来一样,输出效果很好。问题在于输出的频率。Thread.sleep似乎会阻止计时器及时调用函数。