private void button1_Click(object sender, EventArgs e)
{
this.icon_testLOAD.Visible = true;
this.icon_testOK.Visible = false;
this.icon_testBAD.Visible = false;
this.debug("Test Service Button Clicked");
rabbitmq_test t = new rabbitmq_test(button_rabbitmq_test);
this.debug("Calling BeginInvoke on button_rabbitmq_test delegate");
t.BeginInvoke(null, null);
}
所以我有这个按钮点击事件。前三行是打开和关闭包含图标的PictureBox。
this.debug()只调用EventLog.WriteEntry()
button_rabbitmq_test方法如下所示:
protected void button_rabbitmq_test()
{
this.debug("Creating new rabbitmq connection factory");
IConnection connection;
try
{
ConnectionFactory rq_factory = new ConnectionFactory();
rq_factory.Port = Convert.ToInt16(this.psistats_config.rabbitmq_port);
rq_factory.HostName = this.psistats_config.rabbitmq_server;
rq_factory.UserName = this.psistats_config.rabbitmq_username;
rq_factory.Password = this.psistats_config.rabbitmq_password;
rq_factory.RequestedConnectionTimeout = 15000;
this.debug("Creating new rabbitmq connection");
connection = rq_factory.CreateConnection();
this.debug("Changing icon to successful");
rabbitmq_icon_delegate d = new rabbitmq_icon_delegate(this.testOK);
connection.Close();
this.test_button.Invoke(d);
}
catch (Exception exc)
{
if (connection != null)
{
connection.Close();
}
this.debug("Failed testing the rabbit server");
this.debug(exc.Message);
this.debug(exc.StackTrace);
rabbitmq_icon_delegate d = new rabbitmq_icon_delegate(this.testFailed);
this.test_button.Invoke(d);
}
}
此代码在我正在进行开发的计算机上正常工作。该方法执行,事件日志按预期填充。但是,当我在第二台机器上运行此应用程序时,BeginInvoke方法似乎根本没有做任何事情,我完全不知道为什么。
我在事件日志中看到的最后一条消息是“调用BeginInvoke ...”,但是执行实际测试的方法中的事件日志在任何地方都看不到。
申请也没有冻结。我仍然可以使用它。
我不知道自己做错了什么,欢迎任何建议。
答案 0 :(得分:2)
代码存在根本缺陷,您必须调用委托的EndInvoke()方法。最好通过而不是传递null作为第一个参数,使用callback method然后调用EndInvoke()。
如果你没有调用EndInvoke(),那么你将泄漏资源,持续10分钟。并且您要问的最终问题是,您无法看到该方法引发的异常。所以你无法找出它为什么不起作用。调用EndInvoke()会重新抛出该异常。
使用委托的BeginInvoke()方法是一种最好避免的低级编程技术,太容易犯这样的错误而且很难处理异常。改为使用BackgroundWorker或任务。