Является ли вызов Dispatcher.CheckAccess () хорошей формой в Silverlight? - PullRequest
2 голосов
/ 31 октября 2011

Интересно, купит ли следующий код какой-либо прирост производительности:

if (Deployment.Current.Dispatcher.CheckAccess())
{
    DoUIWork();
}
else
{
    Deployment.Current.Dispatcher.BeginInvoke(() =>
    DoUIWork());
}

Достаточно ли умен Dispatcher для короткого замыкания при отправке в поток пользовательского интерфейса, если это не нужно?

Ответы [ 2 ]

0 голосов
/ 31 октября 2011

Если это что-то вроде стандартного Windows SynchronizationContext (и, вероятно, так оно и есть), тогда эти два параметра не совпадают. BeginInvoke, по сути, ставит в очередь метод, который будет выполняться насосом диспетчерских сообщений после обработки текущего выполнения любого существующего сообщения. В вашем примере два параметра будут одинаковыми, если вы будете использовать Invoke вместо BeginInvoke.

0 голосов
/ 31 октября 2011

Я не могу сказать, делает ли диспетчер что-либо дороже при отправке из потока пользовательского интерфейса в себя, по сравнению с проверкой. Но BeginInvoke из потока пользовательского интерфейса может вести себя не так, как выполнение операции напрямую, поскольку он, по крайней мере, помещается в очередь, а не вызывается немедленно. Вы могли бы заметить разницу между этим и удалением условного оператора, если бы у вас был код сразу после этого.

Конечно, стоит знать о потоке управления, достаточно знать, если разница не имеет значения.

...