c# - 如何让每个线程选择不同的项目?

标签 c# multithreading

我有一个有多个线程的程序。用户可以选择要选择的线程数量,并按如下方式处理:

 for (int i = 0; i <= form.Bots - 1; i++)
        {
            (new Thread(() => {

                doThreadWork();

                form.Console = "Thread(" + Thread.CurrentThread.ManagedThreadId + ") FINISHED " + usedCombos.Count + "/" + form.Combolist.Count;




            })).Start();
        }

doThreadWork 是每个线程在关闭之前必须完成的方法。 我有一个数组列表,它由多个项目(行)组成。

例如。

value:value
value1:value1
value2:value2
value11:value11
value4:value4
value13:value13

现在我的程序中存在线程,以使处理这些值的过程更快。程序检查哪个值有效,哪个值无效。 目前我已经实现了一种(可怕的?)方法来选择要检查线程的值。

int index = GetRandomNumber(0, form.Combolist.Count);

这会在列表中选择一个随机索引。 我实现了这个,因为否则如果我只使用 foreach 循环,每个线程都会同时检查相同的值。我需要得到这样的东西:

将以下内容想象为控制台日志。每个线程同时运行。 值总数为 12。运行的线程为 4。

Thread 1: checking index 1
Thread 2: checking index 2
Thread 3: checking index 3
Thread 4: checking index 4
Thread 1: checking index 5
Thread 2: checking index 6
Thread 3: checking index 7
Thread 4: checking index 8
Thread 1: checking index 9
Thread 2: checking index 10
Thread 3: checking index 11
Thread 4: checking index 12
Thread 1: FINISHED
Thread 2: FINISHED
Thread 3: FINISHED
Thread 4: FINISHED

我真的希望你们中的一些先进人士可以帮助我解决这个问题,我没那么先进:)

最佳答案

C# 提供了许多比生成新线程更高级的并行处理方法。

您可以使用的一个选项是 parallel LINQ :

int dop = 4;// set the number of threads to use
form.Combolist
    .AsParallel()
    .WithDegreeOfParallelism(dop)
    .ForAll(i => processElement(i));

您还可以使用 Parallel.ForEach .

关于c# - 如何让每个线程选择不同的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34414908/

相关文章:

c# - 如何使用多线程处理大队列(临时文件?)

c++ - PThread vs boost::thread?

c# - 正则表达式 C# 如何

c# - 检查表单是否加载

c# - 使用 async/await 时是否需要使字段线程安全?

python - 如何在不阻塞 Python 应用程序的情况下运行一段代码?

c# - ZeroMQ 性能问题

c# - Metro 应用程序中的自定义光标

C# 电子邮件 - 新行未使用空白 : pre-wrap 呈现

java - 线程帮助与 Android 游戏