#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 .