c# - 如何将大的 foreach 循环分解为批处理并同时处理?

标签 c# loops c#-4.0 foreach batch-processing

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");                       
}

如果设备是 10000,那么我如何将它分成多个批处理并进行处理?

我试过这段代码,但它没有希望

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

最佳答案

这是一个很好的案例 Parallel.ForEach Loop,它会自动将你的循环处理分配给多个线程。很容易将您的代码重新安排到这样的循环中,并利用内置的 Parallel 库来启用并行处理。这当然假设顺序并不重要(而且它似乎并不基于我们所能看到的一点点)。

编辑: 如果您确实需要评论中指出的特定批处理的 100 或 200,您可以使用 System.Collections.Concurrent.Partitioner根据需要打破并行循环的类,this SO post实际上很好地描述了如何使用它。

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");                       

            });

关于c# - 如何将大的 foreach 循环分解为批处理并同时处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53747939/

相关文章:

c# - 创建 smb 服务器以共享文件

c# - 在.net中处理pcm wav流

mysql - sql中多个相互关联的循环

python - 通过迭代合并 pandas DataFrame 中的行

c# - 在 C# 中使用泛型时如何避免装箱/拆箱?

c# - 为什么在构造时提供了足够大的列表插入失败?

C# 等到接收到数据并进入下一次迭代

java - 如何将输入的计算存储到内存、输入重复、输入的第一个计算添加到输入的第二个计算等等?

ruby - 有什么可以用 Ruby 完成而不能用 C# 4.0 完成的?

xml - 返回 "System.Collections.Generic.List"而不是 XML 或 JSON 中的记录集