2014-01-17 2 views
0

У меня есть экран WinForm, который также является потребителем сообщений (с использованием Rhino ESB). Если я попытаюсь что-то обновить на экране, когда получаю сообщение, ничего не происходит. Вызов Invoke дает мне ошибку, что дескриптор не создан. Форма определенно создана, хотя я запускаю сообщение при нажатии кнопки на форме, и фоновый процесс отправляет сообщение обратно. Именно с этим возвратным сообщением я хочу обновить интерфейс.Доступ к пользовательскому интерфейсу WinForm от клиента службы поддержки Rhino

ЭТО НЕ ВОПРОС ДУБЛИКАТ, НИ ОДИН ИЗ ПРЕДЛАГАЕМЫХ РЕШЕНИЙ.

Я считаю, что разница здесь может быть связана с тем, что я использую сервисную шину 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. 
+0

Я читал эти другие статьи, ни одна из них не работает. Здесь что-то другое. –

+0

Опубликовать репродукцию с помощью решения, предоставленного в этом ответе, который не работает. это может решить вашу проблему. –

+0

Я считаю, что разница в использовании RSB. Я думаю, что это может быть отдельный экземпляр моей формы, и это объясняет, почему он не полностью инициализируется. Редактирование вопроса. –

ответ

0

Это кажется, что вы потребляя 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!"; 
     }); 
    } 
} 
+0

Если я это сделаю, он всегда возвращается. Почему дескриптор не создается, когда я могу обновить элемент из другого места в форме (только не в методе потребления)? –

+0

Ручка должна быть создана через несколько миллисекунд после создания окна. Таким образом, вы можете защитить вызов 'BeginInvoke', если дескриптор еще не создан. Другая возможность - вызвать Control.CreateControl() после создания 'new MainForm()' –

Смежные вопросы