Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 22231|Ответ: 0

[Связь] .net/c# SynchronizationContext для подробностей

[Скопировать ссылку]
Опубликовано 15.03.2018 11:51:07 | | | |
Я прочитал много вводных статей о том, как обновлять основной интерфейс в фоновой теме, и большинство из них используют Control.Invoke и Control.BeginInvoke. Это хорошие решения, но есть две проблемы:

1. Вам нужно обратиться к System.Windows.Forms, а затем использовать System.Windows.Forms

2. Структура кода довольно запутанная. (На самом деле, это тоже вызвано #1)

Microsoft предлагает ещё одно более элегантное решение — System.Threading. SynchronizationContext。 Как видите, она не находится в namesapce System.Windows.Forms, так что мы можем справедливо использовать его в BusinessLaryer, Controler и даже в модулях.

И он очень удобен в использовании, вам нужно сосредоточиться только на следующих двух методах:

1. Отправить: отправляет запрос на обновление интерфейса в основной поток, блокируя текущий поток до его возвращения.

2. Пост: отправляет запрос на обновление интерфейса в основной поток без блокировки текущего потока.

На самом деле, все методы одинаковые, за исключением того, что send синхронен, а post — асинхронен


До появления Form1 form = new Form1(), объект SynchronizationContext был пустым, и при создании формы Form1 объект SynchronizationContext добавлялся в эту ветку. Так что ответ таков: когда создаётся объект Control,, объект SynchronizationContext также создаётся и прикрепляется к потоку. Всё это при использовании вида InitializeComponent(); После этого можно получить объект, который не является NULL


Наконец, разница между методами Sendt() и Post() в SynchronizationContext:

Send() реализуется простым вызовом делегата текущего потока (синхронный вызов). То есть поток пользовательского интерфейса вызывается непосредственно на подпотоке для выполнения, и подпоток продолжит выполнение после завершения выполнения потока пользовательского интерфейса.

Post() реализуется путем вызова делегата в пуле потоков (асинхронный вызов). Это связано с тем, что подпоток находит поток из пула потоков для настройки потока интерфейса, и подпоток напрямую выполняет свой собственный код, не дожидаясь завершения потока UI.
Тестовый код:

Результат:

Основная тема интерфейса: 1
Тема: 5
SynchContext:1


Сводка:Объект SynchronizationContext в потоке пользовательского интерфейса, независимо от того, вызывается ли он в основном потоке или внутри потока, выполняется на основном, поэтому при многозатратном коде интерфейс интерфейса пользовательского интерфейса может зависнуть или сделать выгляд, что он умирает

На самом делеПоток пользовательского интерфейса использует не класс SynchronizationContext, а WindowsFormsSynchronizationContextЭтот Дундон.





Исходный код System.Threading.SynchronizationContext:


Исходный код WindowsFormsSynchronizationContext:







Предыдущий:Сорок семь способов оптимизировать программу на C#
Следующий:.net/c# Shanghai Pai Shanghai Brand Assistant [с исходным кодом]
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com