С# Доступ к значению ConcurrentDictionary по ключу в асинхронном приложенииC#

Место общения программистов C#
Ответить
Anonymous
 С# Доступ к значению ConcurrentDictionary по ключу в асинхронном приложении

Сообщение Anonymous »

У меня вопрос по поводу ConcurrencyDictionary в .NET C#.
Мое приложение будет асинхронным (я пытаюсь это сделать :)).

У меня есть несколько внешних устройств, которые отправляют данные в мое ядро ​​(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);
}
2 способ:

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

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
Ответить

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

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

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

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

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