2012-01-19 3 views
2

В WPF4 Unleashed Адам Натан утверждает:Являются ли классы, наследующие от DispatcherObject потокобезопасными или небезопасными?

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

Professional WPF Программирование утверждает обратное:

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

MSDN на DispatcherObject:

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

Основываясь на описании MSDN он выглядит WPF4 развязали цитата была либо опечатка или Натан был просто неправильно и Professional WPF Программирование авторы были правы ...

Во всяком случае, классы, наследующие от DispatcherObject неотъемлемо потокобезопасен или по своей сути небезопасен?

EDIT:

MSDN также говорится:

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

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

+0

Зависит от вашего определения * thread-safe *. –

ответ

5

Это depends what you mean by thread-safe, но я бы благоприятствовать вид WPF4 необузданной - на основе описания MSDN.

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

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

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

+0

Но если «Только поток, который был создан Диспетчер, может напрямую обращаться к DispatcherObject», не делает его потокобезопасным, потому что он не может быть доступен из потока, отличного от потока. Диспетчер был создан, поток пользовательского интерфейса эффективно ? –

+0

@kzen: он не может быть * правильно * доступен из любого другого потока, но нет ничего, чтобы * остановить * вы пытаетесь сделать это в коде. Он просто взорвется во время выполнения, если вам повезет или работайте * в течение некоторого времени, если вы этого не сделаете. Это похоже на то, что реализация 'IDisposable' является, естественно, ресурсосберегающей: они есть, если вы используете их правильно, но вам все равно нужно положить работу, чтобы убедиться, что вы их уничтожаете ... –

+0

Отличная почта от Eric, спасибо для ссылки ... threading soo much fun;) –

Смежные вопросы