Доступ к пользовательскому интерфейсу WinForm от потребителя Rhino Service Bus
У меня есть экран WinForm, который также является потребителем сообщений (используя Rhino ESB). Если я пытаюсь обновить что-либо на экране при получении сообщения, ничего не происходит. Вызов Invoke дает мне ошибку, что дескриптор не создан. Форма, безусловно, создана, я запускаю сообщение о нажатии кнопки на форме, и фоновый процесс отправляет сообщение обратно. Именно с этим ответным сообщением я хочу обновить пользовательский интерфейс.
Это не дублирующий вопрос, ни одно из предложенных решений не работает.
Я полагаю, что разница здесь может заключаться в том, что я использую служебный автобус Rhino. Rhino может создавать отдельный экземпляр моей формы, а не тот, который я использую. Я думаю, что мне, вероятно, нужно сделать, чтобы Rhino использовал мой экземпляр формы в качестве потребителя, передав свой экземпляр в контейнер IoC, который использует Rhino. Другой вариант - перевести Потребителя в его собственный класс и ввести мою Форму в потребителя, а также добавить в мою форму общедоступный метод для Потребителя. Это может нормально работать с моим приложением, потому что это основная форма и никогда не удаляется, пока приложение не будет закрыто. Это может стать проблемой в другой форме, которая может быть создана несколько раз. Возможно, я мог бы заставить свою форму "наблюдать" за другим статическим объектом, который обновляет отдельный класс Consumer. Пожалуйста, дайте предложения относительно лучшего подхода.
public partial class MainForm : Form, ConsumerOf<MoveJobCompletedEvent>
{
public void Consume(MoveJobCompletedEvent message)
{
// This does nothing!
txtLogs.Text = "\nJob completed!";
}
}
Это выдает ошибку:
this.BeginInvoke((MethodInvoker)delegate
{
txtLogs.Text += "\nJob job completed!";
});
ERROR: Invoke or BeginInvoke cannot be called on a control until the window handle has been created.
1 ответ
Кажется, что вы используете событие JobCompleted до того, как дескриптор окна будет создан. Вы можете попробовать следующее:
public partial class MainForm : Form, ConsumerOf<MoveJobCompletedEvent>
{
public void Consume(MoveJobCompletedEvent message)
{
if (!this.HandleCreated)
return;
this.BeginInvoke((MethodInvoker)delegate
{
txtLogs.Text += "\nJob job completed!";
});
}
}