Нет, никогда не использовал это.И никогда не замечал, что кто-то использует его в контексте пользовательских элементов управления.Это правило также не соблюдается в WPF Toolkit.
Этот подход не только загрязняет код, но и делает ваш пользовательский элемент управления ответственным за то, о чем он не должен заботиться.Рассмотрим ситуацию, когда вы всегда делаете:
// Don't do this in all methods of your custom control!
public void Foo()
{
if (!CheckAccess())
{
Dispatcher.Invoke(()=> Foo()); // Transit to UI Thread
return;
}
// .. do work in UI.
}
На первый взгляд этот код выглядит хорошо.Если вы не в потоке пользовательского интерфейса, перейдите к потоку пользовательского интерфейса, выполните операцию и верните результат.Правильно?- НЕПРАВИЛЬНО!
Проблема 1. Когда вы вызываете Dispatcher.Invoke()
, вы блокируете вызывающий поток, пока ваш запрос не будет обработан потоком пользовательского интерфейса.Это приводит к снижению производительности.Конечно, вы можете изменить это значение на Dispatcher.BeginInvoke()
, теперь ваши клиенты должны знать, что их работа выполняется асинхронно.Т.е. если клиент пишет что-то для управления, а затем сразу же читает его обратно, нет гарантии, что операция уже выполнена потоком пользовательского интерфейса.
Проблема 2. Рассмотрим последующие вызовы метода Foo()
из потока без пользовательского интерфейса.Например, он вызывается в цикле:
// Somewhere not in UI
for (int i = 0; i < 1000000; i++)
{
control.Foo(); // Looks good, but performance is awful!
}
Вместо того, чтобы блокировать вызывающий поток 1000000 раз, разработчик мог бы реализовать одну проверку в вызывающем потоке и при необходимости перейти к пользовательскому интерфейсу, вместо того, чтобы неосознанно возвращаться назад и вычислять ценность между потоками.
Кроме того, WPF выполнит эту проверку для вас, когда вы получите доступ к элементу пользовательского интерфейса из потока, не являющегося пользовательским интерфейсом.Он кричит достаточно громко, чтобы сокрушить приложение и быть услышанным разработчиком, который сделал что-то не так:).
Надеюсь, это поможет.