我有一个 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.