2014-01-17 3 views
0

메시지 소비자이기도 한 WinForm 화면이 있습니다 (Rhino ESB 사용). 메시지를 받았을 때 화면의 내용을 업데이트하려고하면 아무 일도 일어나지 않습니다. Invoke를 호출하면 핸들이 생성되지 않았다는 오류가 발생합니다. 폼이 확실히 만들어졌지만, 폼에서 버튼을 클릭하면 메시지가 나고 백그라운드 프로세스가 메시지를 다시 보냅니다. UI를 업데이트하려고하는이 반환 메시지가 있습니다.Rhino에서 WinForm UI 액세스 서비스 버스 소비자

위와 같은 질문은 중복되는 질문이 아니며, 권장 해결책은 없습니다.

저는 Rhino 서비스 버스를 사용하고 있기 때문에 여기에 차이가 있다고 생각합니다. Rhino는 내가 사용하는 폼이 아닌 폼의 개별 인스턴스를 생성 할 수 있습니다. Rhino에서 사용중인 IoC 컨테이너에 인스턴스를 전달하여 Rhino에서 내 양식 인스턴스를 소비자로 사용하게하는 것입니다. 또 다른 대안은 Consumer를 자신의 클래스로 옮겨서 Form을 소비자에게 주입하고, Consumer가 사용할 수 있도록 내 Form에 public 메소드를 삽입하는 것입니다. 이 앱은 기본 양식이므로 앱이 닫히지 않으면 삭제되지 않습니다. 이것은 여러 번 인스턴스화 될 수있는 다른 형식에서 문제가 될 수 있습니다. 아마도 나는 내 양식이 별도의 소비자 클래스가 업데이트하는 다른 정적 객체를 "관찰"할 수 있습니다. 최상의 접근 방법에 대한 제안을하십시오.

 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) 
    { 
     // This does nothing! 
     txtLogs.Text = "\nJob completed!"; 
    } 
} 

이 오류가 발생합니다. 다음을 시도해 볼 수 있습니다.

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

핸들은 창을 만든 후 몇 밀리 초 후에 만들어야합니다. 따라서 handle이 아직 생성되지 않았다면'BeginInvoke'를 호출하도록 보호 할 수있는 방법입니다. 다른 가능성은 당신이'new MainForm()'을 생성 한 후에 Control.CreateControl()을 호출하는 것입니다. –