Предположения о проведении мероприятия - PullRequest
1 голос
/ 24 декабря 2011

Представьте себе следующий класс:

class A
{
     public event EventHandler AnyEvent;
}

Вы создаете экземпляр класса A и подключаете некоторые обработчики событий.Теперь, если AnyEvent поднято, я бы не предположил, что обработчики событий выполняются в другом потоке, а не в потоке, в котором я создал объект.Это будет иметь первостепенное значение, если вы создали объект в потоке графического интерфейса, а обработчик событий выполняет операции над элементами графического интерфейса.Это заставило бы меня использовать соответствующие шаблоны вызова.

Это действительно становится злом, если вы используете интерфейсы, определяющие события:

interface B
{
     event EventHandler SomeEvent;
}

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

Я думаю, что кодирование всегда должно быть прозрачным - это не так!И если я не создаю другой поток, я не предполагаю, что мои методы выполняются из любого другого потока, кроме моего home .

Есть ли какие-либо аспекты, которые я не делалсчитаете? Любое, что опровергнет мое предположение?

Ответы [ 4 ]

3 голосов
/ 24 декабря 2011

В событиях нет магии. События обрабатываются в потоке, который их вызывает. Он не имеет ничего общего с потоком, который создает объект.

1 голос
/ 24 декабря 2011

Вызов событий - это просто вызов некоторого метода (или набора методов) с использованием механизма, такого как указатели на функции.

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

Может быть, вы черпаете свои предположения из дней COM?

1 голос
/ 24 декабря 2011

Потоки - это ответственность потребителя класса, а не его автора, поэтому ваше предположение неверно.

Следует предположить, что класс не является поточно-ориентированным, если он не документирован как поточно-ориентированный. Даже большинство встроенных классов .NET не являются потокобезопасными, если они не говорят, что они.

Потребитель класса должен знать о многопоточности.

0 голосов
/ 24 декабря 2011

Обратные вызовы обработчика для событий находятся в том же потоке, который вызвал событие.

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