Классы, наследуемые от DispatcherObject, безопасны для потоков или небезопасны для потоков? - PullRequest
2 голосов
/ 20 января 2012

In WPF4 Unleashed Адам Натан заявляет:

Большинство классов WPF являются производными от DispatcherObject и поэтому по своей природе поточно-небезопасны .

Профессиональное программирование WPF утверждает обратное:

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

MSDN для DispatcherObject:

Только поток, в котором был создан Dispatcher, может напрямую обращаться к DispatcherObject.Чтобы получить доступ к DispatcherObject из потока, отличного от потока, в котором был создан DispatcherObject, вызовите Invoke или BeginInvoke для Dispatcher, с которым связан DispatcherObject.

На основе описания MSDN это выглядит как WPF4Выпущенная цитата была либо опечаткой, либо Натан был просто неправ, а Профессиональное программирование WPF авторы были правы ...

В любом случае классы, наследуемые от DispatcherObject, по своей сути поточно-поточные или по своей сутиthread-unsafe?

EDIT:

MSDN также заявляет:

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

Это косвенно подтверждает, что утверждение WPF4 Unleashed в конце концов было точным ...

1 Ответ

5 голосов
/ 20 января 2012

Это зависит от того, что вы подразумеваете под поточно-безопасным , но я бы предпочел представление WPF4 Unleashed - на основе описания MSDN.

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

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

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

...