Как реализовать кеш для отдельных свойств класса? [закрыто]C#

Место общения программистов C#
Ответить
Anonymous
 Как реализовать кеш для отдельных свойств класса? [закрыто]

Сообщение Anonymous »

У меня есть набор устройств в сети, которые обнаруживаются с помощью MDNS (RFC 6762), в одной сети может быть несколько тысяч таких устройств.
Когда обнаружение идентифицирует новое устройство, оно создает экземпляр информации об этом устройстве и сохраняет его в массиве.
К устройству может получить доступ более чем один пользователь, и поэтому информация, хранящаяся в массиве, должна быть регулярно обновляется, чтобы гарантировать, что информация, отображаемая любому пользователю, будет достаточно актуальной (теорема Брюэрса с приоритетом A/P).
Различные классы могут запрашивать объект устройства, и это будет передан обратно из массива как экземпляр объекта в массиве.
Теперь проблема. Если класс Foo запрашивает устройство A из массива обнаружения, а затем класс Bar запрашивает устройство A из массива обнаружения, и между этими двумя запросами детали A обновляются в процессе обнаружения, экземпляр A, удерживаемый Foo и Bar, может отличаться от текущего экземпляра A, содержащегося в массиве процесса обнаружения.
Решение, которое я предложил, похоже, работает, но мой вопрос заключается в том, можно ли его вообще оптимизировать или каждый может придумать (или знает) лучший способ достижения этого результата.

Код: Выделить всё

    public string DeviceName
{
get
{
try
{
if (Discovery.Instance != null)
{
var Target = Discovery.Instance!.Refresh(this.GetInstanceName());
if (Target == null)
{
return _DeviceName;
}
return Target._DeviceName;
}
else
{
return _DeviceName;
}
}
catch (Exception ex) { ex.Report(); }
return _DeviceName;
}
set
{
_DeviceName = value;
}
}
public string _DeviceName { get; private set; } = string.Empty;
Таким образом, класс A поддерживает ссылку на статический экземпляр процесса обнаружения, и когда извлекается параметр в экземпляре этого класса, параметр обновляет поле, запрашивая авторитетный ответ. из процесса обнаружения.
Если Foo или Bar не хотят получать самое актуальное значение, он может просто запросить _DeviceName вместо DeviceName.
Я думаю, что вкратце проблема будет заключаться в том, как я могу обеспечить использование ссылочных значений внутри класса, но это может не совсем отражать то, что я пытаюсь сделать - пожалуйста, не стесняйтесь поделиться своими мыслями по этому поводу. .
РЕДАКТИРОВАТЬ:
Код работает в тот момент, когда имеется небольшое количество устройств, но это создает большую нагрузку на одно точка отказа при увеличении количества устройств - процесс обнаружения. Для большого количества устройств (>1000) с 20–50 свойствами каждое количество вызовов процесса обнаружения составляет около 1500/с.
Цель состоит в том, чтобы иметь кэш на уровне свойств, поскольку свойства запрашиваются индивидуально через UDP после завершения обнаружения, поэтому шаблон контакта будет выглядеть примерно так:
MDNS -> UDP (x50) -> UDP (x1) -> UDP (x5) и т. д.
Изначально казалось, что для достижения этой цели лучше всего подойдет «кэш» на уровне свойств, но это начинает казаться плохим выбором дизайна. Как я могу реализовать кеш, который не создает такой большой нагрузки на процесс обнаружения?
Кэширование, которое должно происходить внутри, — мне нужны два класса, чтобы иметь возможность видеть один и тот же экземпляр. класса устройства одновременно, и изменения будут отражены в том же экземпляре класса устройства.

Подробнее здесь: https://stackoverflow.com/questions/790 ... of-a-class
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»