メッセージ コンシューマーでもある WinForm 画面があります (Rhino ESB を使用)。メッセージを受信したときに画面上の何かを更新しようとしても、何も起こりません。Invoke を呼び出すと、ハンドルが作成されていないというエラーが表示されます。フォームは間違いなく作成されていますが、フォームのボタンをクリックするとメッセージが送信され、バックグラウンドプロセスがメッセージを送り返します。UIを更新したいのは、この返信メッセージです。
これは重複した質問ではありません。提案された解決策はどれも機能しません。
ここでの違いは、Rhino Service バスを使用しているためだと思います。Rhino は、私が使用しているものではなく、私のフォームの別のインスタンスを構築している可能性があります。おそらく必要なことは、Rhino が使用している IoC コンテナーに私のインスタンスを渡すことによって、Rhino にフォームの私のインスタンスをコンシューマーとして使用させることだと思います。もう 1 つの方法は、Consumer を独自のクラスに移動し、Form を Consumer に挿入して、Consumer が使用できるように Form にパブリック メソッドを配置することです。これはメイン フォームであり、アプリを閉じない限り破棄されないため、私のアプリでは問題なく動作する可能性があります。これは、複数回インスタンス化される可能性のある別のフォームでは問題になります。おそらく、別の 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.