Невозможно внедрить код в другой работающий поток. Даже операционная система не может сделать это.
Control.BeginInvoke работает, помещая ссылку на делегат в очередь, а затем используя PostMessage для отправки пользовательского сообщения в очередь сообщений потока пользовательского интерфейса. Цикл сообщений Application.Run ищет это сообщение, а когда обнаруживает, извлекает делегата из очереди и выполняет его.
Суть в том, что нет другого способа сделать то, что вам нужно, без кодирования вашего основного потока для поиска какого-либо сигнала (или сообщения) из другого потока.
Добавлена
Вы заявили, что это приложение WinForm, но у вас нет элемента управления для использования BeginInvoke.
Редактировать: я предложил ленивый груз, не продумывая его. Элемент управления может в конечном итоге быть создан в неправильном потоке .
Предварительно создайте элемент управления до Application.Run
, который будет существовать в течение всего срока службы приложения. Вы можете использовать это для BeginInvoke от.
Редактировать # 3
Итак, я пытаюсь убедиться, что это работает, и, конечно, это не так. Вы не можете просто создать универсальный элемент управления, он должен иметь дескриптор HWND. Простое исправление: создайте его так:
invokerControl = new Control();
invokerControl.CreateControl();
Это позволит вам BeginInvoke из него, даже если нет открытых объектов Form для вызова из.