Как правильно использовать ThreadA сигнал ThreadB о каком-то событии, при этом ThreadB не блокируется в ожидании события?
у меня есть фоновая ветка, которая будет заполнять общий список ‹T›. Я пытаюсь найти способ асинхронно сигнализировать «основному» потоку о том, что есть данные, которые можно получить.
Я рассматривал возможность установки события с помощью объекта EventWaitHandle, но я не могу разместить основной поток в Event.WaitOne ().
Я рассматривал возможность обратного вызова делегата, но а) я не хочу, чтобы основной поток выполнял работу в делегате: поток должен вернуться к работе, добавив больше материала - я не хочу, чтобы он ждал, пока выполняется делегат, и b ) делегат должен быть направлен в основной поток, но я не использую пользовательский интерфейс, у меня нет элемента управления. Вызвать делегата.
Я считал, что у делегата есть обратный вызов, который просто запускает System.Windows.Forms.Timer с нулевым интервалом (с синхронизированным доступом потока к таймеру). Таким образом, потоку нужно только застрять, когда он вызывает
Timer.Enabled = true;
но это похоже на взлом.
Раньше мой объект создавал бы скрытое окно, и поток отправлял сообщения в HWND этого скрытого окна. Я подумал о создании скрытого элемента управления, но я понимаю, что вы не можете. Вызвать элемент управления без созданного дескриптора. Кроме того, у меня нет пользовательского интерфейса: мой объект мог быть создан на веб-сервере, службе или консоли, я не хочу, чтобы появлялся графический элемент управления, и я не хочу компилировать зависимость от System.Windows. Формы.
Я подумывал о том, чтобы мой объект открывал интерфейс ISynchronizeInvoke, но тогда мне нужно было бы реализовать .Invoke (), и это моя проблема.
Каков правильный метод, чтобы поток A сигнализировал потоку B о каком-то событии, не блокируя поток B в ожидании события?