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