【问题标题】:Start multiple threads at the same time without slowing down同时启动多个线程而不会减慢
【发布时间】:2018-08-29 09:24:19
【问题描述】:

我知道这个问题无处不在,但我找不到适合我的问题。

我正在尝试同时启动 10 个线程而不减慢每个线程的速度。

我的问题是当我手动启动线程时,它们非常快。但是如果我使用循环启动它们,它们会非常慢。

这里是快速的地方:

            Thread tid1 = new Thread(new ThreadStart(Thread));
            tid1.Start();
            Thread tid2 = new Thread(new ThreadStart(Thread));
            tid2.Start();
            Thread tid3 = new Thread(new ThreadStart(Thread));
            tid3.Start();
            Thread tid4 = new Thread(new ThreadStart(Thread));
            tid4.Start();
            Thread tid5 = new Thread(new ThreadStart(Thread));
            tid5.Start();
            Thread tid6 = new Thread(new ThreadStart(Thread));
            tid6.Start();
            Thread tid7 = new Thread(new ThreadStart(Thread));
            tid7.Start();
            Thread tid8 = new Thread(new ThreadStart(Thread));
            tid8.Start();
            Thread tid9 = new Thread(new ThreadStart(Thread));
            tid9.Start();
            Thread tid10 = new Thread(new ThreadStart(Thread));
            tid10.Start();

我尝试过的慢方法:

1:

foreach (var i in Enumerable.Range(1, 10))
{
    Thread tid = new Thread(new ThreadStart(Thread));
    tid.Start();
}

2:

Parallel.ForEach(Enumerable.Range(1, 10), i => 
{
        Thread tid = new Thread(new ThreadStart(Thread));
        tid.Start();
});

任何帮助将不胜感激。

谢谢!

【问题讨论】:

  • 您正在调用构造函数 ThreadStart。构造函数中有什么代码?构造函数必须在下一个线程开始之前完成执行。
  • 您一般要达到什么目的?为什么需要同时启动它们
  • “我有很多工作要做”并不能完全解释为什么这是一个问题。确定使用Parallel 功能会达到预期的效果吗?
  • 您是否考虑过使用异步/等待任务 (TPL) 或 ThreadPool 线程?尽管有可能,但使用普通线程有点过时了。此外,“更多线程”不一定等于“更快”。
  • 你能澄清一下这里的“快”和“慢”的意思吗?你有什么基准,什么是实际可衡量的结果,你想达到什么目标?

标签: c# multithreading loops foreach


【解决方案1】:

经过一番修改,这个方法似乎很快:

List<Thread> threadlist = new List<Thread>();
for (int i = 0; i <= 10; i++)
    threadlist.Add(new Thread(new ThreadStart(wastetime)));

foreach (Thread t in threadlist)
    t.Start();

制作一个线程列表,然后在列表完成后启动它们。如果线程创建子在它自己的迷你线程上,则加分。

虽然要小心魔法,但每个线程都有开销和额外的处理,所以如果在每个线程上执行的任务是短暂的,整个线程的想法将失去性能而不是获得它。

【讨论】:

  • 这是 VB.NET?
  • 是的,同样的事情:)
  • 是的,它只是 thread.sleeps 几秒钟,模拟一个漫长的过程。
猜你喜欢
  • 1970-01-01
  • 2023-03-06
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
  • 2017-03-27
  • 1970-01-01
相关资源
最近更新 更多