在C#中动态创建线程,然后等待它们全部完成

时间:2019-05-24 22:01:37

标签: c# multithreading

我只想并行化.NET Core控制台应用程序的一部分,但是我还想从命令行参数动态启动线程。我正在利用模数运算符在线程之间大致均匀地划分项目列表。

我尝试了一些事情:

for (var t = 0; t < numThreads; t++)
            {
                //spin up a thread
                var group = data.Where(x => x.ID % (ulong)numThreads == (ulong)t).ToList();

                jobThreads.Add(new JobThread
                {
                    ThreadNumber = t,
                    Data = group,
                });
            }

         Parallel.ForEach(jobThreads, (thread) =>
         {
             DoWork(thread.Data);
         });

Parallel.ForEach是纯净的语法糖,但实际上并未并行运行线程。它等待一个线程结束,然后再旋转一个新线程。

使用for循环创建Task对象的列表,然后我再用WaitAll也不起作用。它也可以串联而不是并联运行。

“原始”实际上最有效,它独立/并行运行线程,但是在继续执行程序的下一部分之前,我无法告知它们何时完成(好像没有线程一样运行)如预期的那样,在此之前-我只是不知道通过for循环整体创建它们时是否有办法“等待”它们。

for (var t = 0; t < numThreads; t++)
            {
                //spin up a thread
                var group = data.Where(x => x.ID % (ulong)numThreads == (ulong)t).ToList();

                Thread thread = new Thread(new ParameterizedThreadStart(DoWork);
                thread.Start(group);
            }

编辑:是的,重复的正是我想要的。谢谢

0 个答案:

没有答案