如何将大型foreach循环分解为批处理并同时处理它?

Neo*_*Neo 2 c# foreach loops batch-processing c#-4.0

foreach (var deviceId in deviceList)
{
    // register device into IoT hub 
    Device device;
    RegistryManager registryManager = RegistryManager.CreateFromConnectionString("connectionString");
    device = await registryManager.AddDeviceAsync(new Device(deviceId));

    // send message to iot hub
    DeviceClient deviceClient;
    await deviceClient.SendEventAsync("data");                       
}
Run Code Online (Sandbox Code Playgroud)

如果设备是10000,那我怎么能把它分成多个批处理并处理呢?

我试过这个代码,但它并没有让人失望

public IEnumerable<user> GetBatch(int pageNumber)
{
    return users.Skip(pageNumber * 1000).Take(1000);
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ner 6

这是Parallel.ForEach循环的一个很好的例子,它将自动在多个线程中分配循环处理.很容易将代码重新排列到这样的循环中,并利用内置的并行库来启用并行处理.这当然假定序列并不重要(并且它似乎不基于我们可以看到的很少).

编辑:如果您确实需要评论中指出的100或200的特定批次,您可以使用System.Collections.Concurrent.Partitioner类根据需要打破并行循环,这个SO帖子实际上做得很好描述如何用它.

Parallel.ForEach(devices, (device) =>
            {
                        // register device into IoT hub 
                        Device device;
            RegistryManager registryManager = RegistryManager.CreateFromConnectionString("connectionString");
                        device = await registryManager.AddDeviceAsync(new Device(deviceId));


                        // send message to iot hub
                         DeviceClient deviceClient;
                        await deviceClient.SendEventAsync("data");                       

            });
Run Code Online (Sandbox Code Playgroud)