Мое приложение будет асинхронным (я пытаюсь это сделать
У меня есть несколько внешних устройств, которые отправляют данные в мое ядро (C# .NET) через TCPIP-связь. Я храню объекты в значениях ConcurrentDictionary для каждого устройства. У меня есть некоторые операции с этими данными, когда мне нужно их прочитать, а иногда и изменить что-то в объекте.
Теперь он выглядит хорошо без взаимоблокировок (когда я увеличиваю количество внешних/моделируемых устройств, он не замедляется, но может обрабатывать больше сообщений за одно и то же время (и без данные теряются)
Но: я не уверен, правильно ли я его использую.
Мне нужно изменить некоторые значения внутри объекта, вызвать некоторые функции и сохранить все изменения в словаре. Все объекты в словаре должны быть доступны. читается другими процессами (я знаю, что во время «DoJob» другие процессы могут иметь старые значения в dict, пока я не сохраню значение, но в моем случае это нормально, мне просто нужно избегать блокировки/блокировки других задач и делать это как можно быстрее). насколько это возможно.
Какой способ лучше:
1 способ (я использую его сейчас):
Код: Выделить всё
var dict = new ConcurentDictionary(concurrencyLevel, initalCapacity);
private async Task DoJob(string myKey)
{
MyClass myClass;
MyClass myClassInitState;
dict.TryGetValue(myKey, out myClass);
dict.TryGetValue(myKey, out myClassInitState);
var value = myClass.SomeValueToRead;
myClass.Prop1 = 10;
await myClass.DoSomeAnotherJob();
dict.TryUpdate(myKey, myClass, myClassInitState);
}
Код: Выделить всё
var dict = new ConcurentDictionary(concurrencyLevel, initalCapacity);
private async Task DoJob(string myKey)
{
var value = dict[myKey].SomeValueToRead;
dict[myKey].ChangeProp1(10);
await dict[myKey].DoSomeAnotherJob();
}
Смогу ли я заблокировать другие темы/задачи?
Какой путь будет быстрее? Я ожидаю первого, потому что внутри DoJob я работаю не с dict, а с какой-то копией объекта и все-таки обновлю dict.
Читает ли значения напрямую (#2) могут замедлить весь процесс?
Могут ли другие процессы без проблем прочитать последнее актуальное значение из dict даже во время #2?
Что происходит, когда я звоните:
Код: Выделить всё
dict[myKey].DoSomeAnotherJob();Он является ожидаемым, поэтому не должен блокировать потоки. Но на самом деле он вызывается в общем словаре в некотором его значении.
Подробнее здесь: https://stackoverflow.com/questions/598 ... -async-app
Мобильная версия