Я только немного знаком с многопоточностью, потому что я читал об этом, но никогда не использовал это на практике.
У меня есть проект, который использует стороннюю библиотеку, которая разделяет состояние устройства ввода, вызывая события. Проблема в том, как в библиотеке написано, что эти события вызываются из другого потока.
Мое приложение не должно быть многопоточным, и я столкнулся с множеством классических проблем с потоками (пользовательский интерфейс контролирует жалобы на взаимодействие с другим потоком, коллекции, которые модифицируются, когда один фрагмент кода повторяется это и т. д.).
Я просто хочу, чтобы событие сторонней библиотеки было возвращено в мой поток пользовательского интерфейса. В частности, я думаю, что это должно произойти:
Мой класс получает событие, и обработчик запускается в потоке, отличном от пользовательского интерфейса. Я хочу обнаружить это условие (как с InvokeRequired), а затем выполнить эквивалент BeginInvoke, чтобы вернуть управление потоку пользовательского интерфейса. Тогда соответствующие уведомления могут быть отправлены вверх по иерархии классов, и все мои данные будут затронуты только одним потоком.
Проблема в том, что класс, который получает эти входные события, не является производным от Control и поэтому не имеет InvokeRequired или BeginInvoke. Причина этого в том, что я попытался четко отделить пользовательский интерфейс и основную логику. Класс все еще выполняется в потоке пользовательского интерфейса, он просто не имеет никакого пользовательского интерфейса внутри самого класса.
Прямо сейчас я решил проблему, разрушив это разделение. Я передаю ссылку на элемент управления, который будет отображать данные из моего класса и использовать его методы Invoke. Кажется, что это противоречит цели их разделения, потому что теперь базовый класс напрямую зависит от моего конкретного класса пользовательского интерфейса.
Может быть, есть способ сохранить ссылку на поток, который запустил конструктор, а затем есть что-то в пространстве имен Threading, которое будет выполнять команды Invoke?
Есть ли способ обойти это? Мой подход совершенно неверен?