Delegate.BeginInvoke 似乎没有在另一台电脑上执行任何操作

本文关键字:一台 电脑 操作 任何 执行 BeginInvoke Delegate | 更新日期: 2023-09-27 18:35:32

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);
}

所以我有这个按钮点击事件。前三行是打开和关闭包含图标的图片框。

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 方法似乎根本没有执行任何操作,我完全不知道为什么。

我在事件日志中看到的最后一条消息是"正在调用开始调用..."但是,在任何地方都看不到来自执行实际测试的方法的事件日志。

应用程序也不会冻结。我仍然可以使用它。

我不知道我做错了什么,欢迎任何建议。

Delegate.BeginInvoke 似乎没有在另一台电脑上执行任何操作

代码存在根本缺陷,必须调用委托的 EndInvoke() 方法。 最好不要将 null 作为第一个参数传递,使用然后调用 EndInvoke() 的回调方法。

如果你不调用 EndInvoke(),那么你将泄漏资源,持续 10 分钟。 您询问的最终问题是,您看不到该方法引发的异常。 所以你找不到为什么它不起作用。调用 EndInvoke() 会重新引发该异常。

使用委托的 BeginInvoke() 方法是一种最好避免的低级编程技术,太容易犯这样的错误,也太难处理异常。 请改用 BackgroundWorker 或任务。