Как разбить большой цикл foreach на партию и обрабатывать ее одновременно? - PullRequest
0 голосов
/ 12 декабря 2018
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);
}

1 Ответ

0 голосов
/ 12 декабря 2018

Это отличный случай для цикла 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");                       

            });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...