правильный способ перебирать данные в классе, когда данные изменяются асинхронно - PullRequest
2 голосов
/ 09 февраля 2010

У меня есть класс C #, в котором есть словарь. Класс асинхронно прослушивает сообщения, которые по прибытии и обработке изменяют данные в словаре.

Каков «правильный» способ для приложения, которое использует экземпляр этого класса для перебора данных в словаре? Должен ли я обернуть его в другой класс и реализовать какой-нибудь перечислитель? Уместно ли добавить что-то вроде методов Pause и Resume в класс, который приложение может вызывать, когда оно хочет перебрать данные?

Ответы [ 3 ]

1 голос
/ 09 февраля 2010

Что ж, вы должны заблокировать словарь в любое время, когда вы итерируете его или модифицируете.

Вроде так:

var d = new Dictionary<int, string>();

lock (d)
{
    d.Add(1, "Q");
}

lock (d)
{
    foreach (var p in d)
    {
        Console.WriteLine(p.Key + " => " + p.Value);
    }
}

Если ваша итерация будет делать что-то существенное, вы должны скопировать ее перед началом итерации.

IList<KeyValuePair<int, string>> d2;

lock (d)
{
    d2 = d.ToList();
}

foreach (var p in d2)
{
    Console.WriteLine(p.Key + " => " + p.Value);
}
0 голосов
/ 09 февраля 2010

На самом деле есть 2 варианта того, как клиент может перебирать данные

  1. Он может получить такую ​​же блокировку синхронизации, которая используется для защиты данных при полном обновлении.
  2. Класс, отвечающий за данные, может возвратить независимую копию данных вызывающей стороне
0 голосов
/ 09 февраля 2010

Другим вариантом является копирование данных перед итерацией.

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