Вопрос больше по проектированию, но применительно к C#.
Есть класс логики, который реализует логику приложения. Есть класс формы, который владеет первым классом. Класс логики содержит пул потоков, в которых генерируются события. Он эти события обрабатывает и пересылает форме. В результате в форме вызываются обработчики событий из сторонних потоков, и приходится вызывать .InvokeRequired, .Invoke и т.п.
Мне кажется, в правильной структуре, не должно быть такой ситуации, что форма должна заботиться о том, чтобы вызов был из нужного потока. Если это верно, то тогда вопрос по реализации: как правильно сделать, чтобы класс логики всегда вызывал события из того потока, в котором был создан?
Передавать родительский контрол ему в конструктор, у которого потом зызывать .Invoke — решение очевидное, но классу логики ни к чему связь с System.Windows.Forms.Control.