Вызывает Dispatcher.checkAccess() хорошей формой в Silverlight?

#c# #multithreading #silverlight #user-interface #dispatcher

#c# #многопоточность #silverlight #пользовательский интерфейс #диспетчер

Вопрос:

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

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

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

Ответ №1:

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

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

Ответ №2:

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