SynchronizationContext и InvokeRequired - PullRequest
       30

SynchronizationContext и InvokeRequired

5 голосов
/ 29 марта 2011

Я искал ответ на этот вопрос, но не могу найти удовлетворительного ответа. Может быть, кто-то здесь может просветить меня.

У меня есть потомок BindingList<T>, который хранит ссылку на объект SynchronizationContext, чтобы вызвать его измененные события в потоке пользовательского интерфейса.

Теперь также возможно, что это BindingList<T> было создано и использовано в потоке пользовательского интерфейса, а не в фоновом потоке. Как я могу проверить это без свойства типа InvokeRequired, доступного для меня? Каковы последствия вызова SynchronizationContext.Send в потоке пользовательского интерфейса?

Ответы [ 2 ]

3 голосов
/ 29 марта 2011

Метод Send на SynchronizationContext будет выполняться синхронно и вызовет deletegane в потоке, к которому привязан SynchronizationContext. Если SynchronizationContext привязан к потоку пользовательского интерфейса, а код в данный момент выполняется в потоке пользовательского интерфейса, то делегат будет вызван напрямую, без необходимости маршалинга между потоками.

0 голосов
/ 08 января 2014

Метод send будет выполняться синхронно и в потоке пользовательского интерфейса, это правда.Однако одно из возможных следствий, о котором следует беспокоиться, это то, что вызов Send увеличит стек вызовов.

Так, например, следующий код:

for (int i = 0; i < 10000000; i++) syncContext.Send(....);

вызовет исключение StackOverflow ..Вот почему было бы разумно избегать использования контекста синхронизации, если вы уже работаете в нужном потоке.Я не знаю ни одного способа полной проверки того, в каком потоке был создан список, кроме внутренней бухгалтерии.

...