Как оптимизировать параллелизм чтения и записи коллекции с помощью вызова WCF? - PullRequest
1 голос
/ 27 апреля 2011
  1. На моей стороне службы WCF есть переменная Collection и метод Add. Метод Add записывает некоторые записи в коллекцию, в то время как что-то срабатывает. Вот требования: Теперь на стороне клиента есть Поток, который каждую секунду считывает Коллекцию на сервисной стороне WCF, удаляет записанные ранее записи и отображает их на переднем плане.

Мой вопрос : как лучше контролировать одновременность чтения и записи (не является потокобезопасным, поэтому при его чтении будут получены повторяющиеся значения)

В настоящее время я использую таймер для параллелизма, когда срабатывает событие таймера, заставляю таймер останавливаться, пока чтение не закончится. Затем включите таймер (для предотвращения не полностью выполненного события таймера снова запустите следующую операцию). Monitor используйте Monitor.TryEnter в качестве блокировки потока, и код выглядит следующим образом:

void ReadFromService()
{
//do........
timer.start();//
}


Timer timer=new Timer(1000);

timer.Elapsed +=(s,e)=>{
timer.stop();
ReadFromService();
};
timer.start();

Я думаю, что это не очень хорошая идея, я надеюсь, что кто-то может дать мне хорошее предложение.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2011

Посмотрите класс

ConcurrentList<T>

по этой ссылке: http://www.deanchalk.me.uk/post/Task-Parallel-Concurrent-List-Implementation.aspx

0 голосов
/ 27 апреля 2011

Желательно, чтобы в вашем клиенте Reader не было таймера.Дело не в том, что параллелизм особенно сложен, просто неэффективно опрашивать по каналу связи.

Вместо этого вы можете использовать метод Add для запуска события в клиенте Reader, чтобы передать ему добавленные записи илипусть это событие действует как триггер для чтения обновленного снимка коллекции, а затем служба соответствующим образом блокирует коллекцию перед возвратом нового снимка.

Это ограниченная форма шаблона Observer , и ее легко расширить, если у вас есть более полные читатели коллекции или новые читатели, которые хотят видеть изменения различных подмножеств данных из коллекции.

Информация о событиях WCF (обратные вызовы) здесь .

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