Итак, у вас есть два потока пользовательского интерфейса, оба из которых обращаются к объекту.
Что нужно знать о InvokeRequired, так это то, что все, что он делает, это проверяет, является ли текущий исполняемый поток тем же потоком, в котором был создан элемент управления.
bool InvokeRequired
{
// vastly simplified
get { return GetCurrentThreadId() != GetWindowThreadId(this.Handle); }
}
Так почему это важно? Поскольку окна Windows (элементы управления и т. Д.) Могут безопасно отправлять сообщения только из того потока, который их создал. Они по своей природе не являются поточно-ориентированными. Изменение свойств элементов управления обычно требует отправки сообщений.
Таким образом, вам нужно только проверить InvokeRequired, если вы собираетесь изменить свойство какого-либо элемента управления. Если да, и InvokeRequired возвращает значение true, то вам нужно использовать Control.Invoke или Control.BeginInvoke для выполнения изменения свойства из потока, которому принадлежит элемент управления.