ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Использование SynchronizationContext
Как я уже говорил, метод Invoke является наиболее распространенным способом синхронизации пользовательского интерфейса с отдельным потоком. Однако у него есть недостаток, иногда ограничивающий его применимость. Дело в том, что для его работы элемент, у которого он вызывается, должен быть отображен на экране. Говоря более строго, у него должен быть действительный (рабочий, валидный) handle окна. Т.е. элемент не только должен быть создан конструктором, но и отображен. Это не всегда возможно. В данном случае на помощь приходит класс SynchronizationContext (программа ThreadingWinFormsSynchronization). Получить объект этого класса очень просто. Для этого используется его статическое свойство Current. Оно возвращает синхронизационный контекст потока. Однако знайте, что у потока может не быть синхронизационного контекста. Поэтому это свойство может возвращать и null. Однако метод Application.Run, запускающий WinForms–приложение, всегда устанавливает этот контекст для потока пользовательского интерфейса. Поэтому вы можете безопасно получить его, обычно это делается по событию загрузки главной формы: private void MainForm_Load(object sender, EventArgs e) { m_SyncContext = SynchronizationContext.Current; }
Вы должны сохранить ссылку на синхронизационный контекст, чтобы он был доступен в вашем отдельном потоке. Синхронизационный контекст имеет 2 основных метода: Send и Post. Обоим передается делегат SendOrPostCallback и параметр для него. Первый выполняет переданный ему делегат синхронно (блокируя вызвавший метод Send поток до тех пор, пока делегат не будет исполнен), а второй – асинхронно. Применение этих методов может выглядеть примерно таким образом: m_SyncContext.Send( new SendOrPostCallback( delegate { pb.Minimum = 0; pb.Maximum = 100; pb.Value = 0;
btnCheck.Enabled = false; } ), null ); Использование анонимных методов позволяет избавиться от необходимости писать отдельные методы и передавать им параметры. Это еще одно преимущество перед использованием метода Invoke. Ему передать анонимный метод не удастся.
Не нашли, что искали? Воспользуйтесь поиском:
|