Одно из основных правил многопоточной разработки для форм Windows гласит: ‘‘«Обращение к элементу управления должно производится из того потока, в котором этот элемент управления был создан»’’. Обычно эта задача решается вызовом методов Control.Invoke
(синхронный запуск делегата) и Control.BeginInvoke
(асинхронный запуск делегата).
Однако иногда возникает необходимость запустить код в основном потоке приложения при отсутствии ссылки на контрол, созданный в этом потоке. Для решения задачи запуска кода в основном потоке из другого потока в WinForms применяется класс SynchronizationContext
. В Flexberry Platform обратиться к контексту синхронизации можно посредством вызова UISynchronization.Context
, статическое поле Context
инициализируется в конструкторе формы рабочего стола.
Пример:
if (UISynchronization.Context!=null)
UISynchronization.Context.Send((delegate
{
bugReportProvider.SaveError(_screenShots, sysInfo, exceptions[0] as Exception);
}), null);