Это отличный случай для цикла Parallel.ForEach , который автоматически распределяет обработку вашего цикла по нескольким потокам.Очень легко перестроить ваш код в такой цикл и использовать встроенную библиотеку Parallel для обеспечения параллельной обработки.Это предполагает, конечно, что последовательность на самом деле не имеет значения (и, похоже, она не основана на том, что мало мы можем видеть).
РЕДАКТИРОВАТЬ: Если вам нужны конкретные партии 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");
});