Один подписчик событий .NET, связанный с несколькими издателями событий и многопоточностью - PullRequest
1 голос
/ 20 августа 2010

Предположим, у меня есть один класс, содержащий простой метод.Допустим, есть делегат с той же сигнатурой, что и у этого метода.

Я хочу запустить несколько длительных процессов, каждый из которых запускается из этого класса.Каждый процесс содержит событие, которое состоит из многоадресных делегатов того же типа, что и упомянутый выше делегат.Как только создается экземпляр каждого «рабочего» класса, упомянутый выше «управляющий» класс подписывается на событие рабочего с помощью того же простого метода, упомянутого выше.Когда работа каждого работника завершена, вызывается его событие.

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

Есть ли гарантия, учитывая, что делегаты неизменны, что каждый поток будет иметь эксклюзивный доступ кпростой метод?Меня не беспокоит блокировка кода в простом методе, я обеспокоен тем, что Thread # 1 вызовет метод с набором параметров, а Thread # 2 вызовет тот же метод почти в одно и то же время.

Перед тем, как поток № 1 войдет в оператор блокировки, может ли поток № 2 (который входит в метод почти одновременно с потоком № 2) перезаписать параметры, указанные в потоке № 1, в результате чего параметры потока № 2 будут эффективно обработаны дважды?

Я понимаю, что это немного глоток, я был бы рад предоставить больше информации.

Ответы [ 3 ]

3 голосов
/ 20 августа 2010

Потоки не могут переопределять параметры в методах - они хранятся в стеке и всегда безопасны для потоков.Единственная вещь, которая не может быть поточно-безопасной в вашем случае, это состояние вашего класса.

1 голос
/ 20 августа 2010

Похоже, вы идеальный кандидат на Reactive Framework. (RX)

http://codebetter.com/blogs/matthew.podwysocki/archive/2009/10/14/introducing-the-reactive-framework-part-i.aspx

Я все еще пытаюсь обернуть голову вокруг этого, но этот сценарий прямо в центре внимания для этой новой технологии.

0 голосов
/ 20 августа 2010

Спасибо вам обоим за ваши ответы.

@ Grzenio: если поток не может перезаписать параметры метода, означает ли это, что операторы блокировки не нужны в самом методе, т. Е. Метод эффективно поточно-ориентирован:

private void DoSomething(object someObject, object someOtherObject) {
   lock(someVariable) {

   // Does this code need to be locked, or is the method thread-safe?
   // Surely 2 threads accessing this method could result in a race condition?

   }
}

@ Тим: Спасибо, я посмотрю на это.

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