如何将大的 foreach 循环分解为批处理并同时处理?
How to break big foreach loop into batch and process it simultaneously?
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 循环的绝佳案例,它会自动将您的循环处理分配到多个线程。很容易将您的代码重新安排到这样的循环中,并利用内置的 Parallel 库来启用并行处理。这当然假设顺序并不重要(而且它似乎并不基于我们所能看到的一点点)。
编辑:
如果您确实需要评论中指出的特定批次的 100 或 200,您可以使用 System.Collections.Concurrent.Partitioner class to break a parallel loop up as desired, 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");
});
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 循环的绝佳案例,它会自动将您的循环处理分配到多个线程。很容易将您的代码重新安排到这样的循环中,并利用内置的 Parallel 库来启用并行处理。这当然假设顺序并不重要(而且它似乎并不基于我们所能看到的一点点)。
编辑: 如果您确实需要评论中指出的特定批次的 100 或 200,您可以使用 System.Collections.Concurrent.Partitioner class to break a parallel loop up as desired, 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");
});