Silverlight фоновая нить для измерения высоты - PullRequest
1 голос
/ 10 ноября 2009
Thread MeasureThread = new Thread(delegate()
{
  TextBlock tb = new TextBlock();
});
MeasureThread.Start();

Это вызывает недопустимое исключение доступа к многопоточному режиму, даже если этот конкретный TextBlock никогда не будет добавлен в визуальное дерево. Я понимаю, что мог бы обернуть его с помощью Dispatcher.BeginInvoke, но это, кажется, лишает смысла использование фонового потока. Я хотел использовать это текстовое поле, чтобы вычислить высоту некоторого текста для 1000+ различных текстов. Я надеялся, что смогу сделать этот расчет в фоновом потоке.

1 Ответ

1 голос
/ 10 ноября 2009

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

Я полагаю, что причина того, что вы не хотите размещать эту логику в потоке пользовательского интерфейса, заключается в том, что она приведет к блокировке пользовательского интерфейса во время вычисления. Один из способов обойти это сделать то, что вы предложили; используйте Dispatcher.BeginInvoke. И вместо того, чтобы просто вызывать вычисление для 1000+ TextBlocks, вы можете вызывать вычисление для одного TextBlock, а затем, когда оно завершится, вызывать следующее и так далее. Вы также можете использовать DispatcherTimer, чтобы планировать, когда что-то происходит. Таким образом, вы разбиваете свои большие вычисления, чтобы пользовательский интерфейс никогда не зависал полностью; конечно, для завершения вычисления потребуется больше времени, но вы делаете это без блокировки потока пользовательского интерфейса на длительный период времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...