0

メッセージ コンシューマーでもある 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.
4

1 に答える 1

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!";
        });
    }
}
于 2014-01-17T15:53:59.383 に答える