0

我有一个 WinForm 屏幕,它也是一个消息使用者(使用 Rhino ESB)。如果我在收到消息时尝试更新屏幕上的任何内容,则不会发生任何事情。调用 Invoke 给我一个错误,即未创建句柄。虽然表单肯定是创建的,但我在表单上的按钮单击时发出一条消息,后台进程会发回一条消息。我想通过这个返回消息更新 UI。

这不是一个重复的问题,建议的解决方案都不起作用。

我相信这里的区别可能是因为我使用的是 Rhino 服务总线。Rhino 可能正在构建我的表单的一个单独实例,而不是我正在使用的那个。我认为我可能需要做的是让 Rhino 使用我的表单实例作为消费者,方法是将我的实例传递到 Rhino 正在使用的 IoC 容器中。另一种选择是将消费者移到它自己的类中并将我的表单注入消费者,并在我的表单上放置一个公共方法供消费者使用。这可能适用于我的应用程序,因为这是主要形式,除非应用程序关闭,否则永远不会被释放。这在可能被多次实例化的另一种形式上会成为问题。也许我可以让我的表单“观察”另一个由单独的 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 回答