В моем приложении я хочу добавить, скажем, 20 устройств, начиная с порта 10, используя функцию AddDeviceAsync
, которая принимает template
в качестве параметра, который используется для создания фактического устройства с именем template.Name
, связавшись с портом port
.
Я использую SemaphoreSlim, чтобы предотвратить утомительную работу системы, пытаясь добавить одновременно на несколько устройств.
using (var semaphore = new SemaphoreSlim(10))
{
var tasks = Enumerable.Range(startPort, devicesCount).Select(
async port =>
{
try
{
await semaphore.WaitAsync().ConfigureAwait(false);
template.Name = $"{device.Name} {port}";
template.CommunicationSettings.Port = port;
await this.equipmentNewApplicationService.AddDeviceAsync(template).ConfigureAwait(false);
}
finally
{
semaphore.Release();
}
});
await Task.WhenAll(tasks).ConfigureAwait(false);
}
Что-то не так с моим кодом, потому что как только начинается дросселирование (deviceCount
= 20)
Некоторые устройства имеют одинаковое название:
DeviceName-10
DeviceName-11
DeviceName-12
DeviceName-13
DeviceName-14
DeviceName-14
DeviceName-14
DeviceName-17
Примечание: неверно только имя устройства - устройства подключены к правильному порту.
Я подозреваю, что это каким-то образом связано с async closure
в select
, но я действительно не могу этого понять.