C# Delegate.BeginInvoke不';在不同的电脑上似乎什么都不做

C# Delegate.BeginInvoke不';在不同的电脑上似乎什么都不做,c#,winforms,delegates,C#,Winforms,Delegates,所以我有这个按钮点击事件。前三行是打开和关闭包含图标的PictureBox this.debug()只调用EventLog.WriteEntry() 按钮\u rabbitmq\u测试方法如下所示: private void button1_Click(object sender, EventArgs e) { this.icon_testLOAD.Visible = true; this.icon_testOK.Visible = false; this.icon_te

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

this.debug()只调用EventLog.WriteEntry()

按钮\u rabbitmq\u测试方法如下所示:

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);
}
这段代码在我正在开发的计算机上运行良好。方法执行后,事件日志按预期填充。然而,当我在第二台机器上运行这个应用程序时,BeginInvoke方法似乎什么都不做,我完全不知道为什么

我在事件日志中看到的最后一条消息是“Calling BeginInvoke…”,但是执行实际测试的方法中的事件日志在任何地方都看不到

应用程序也没有冻结。我仍然可以使用它


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

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

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


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

您使用的是EventLog的静态WriteEntry方法还是实例方法?同意。微软在这方面有一定的过错,因为它给两个用于类似事情(触发另一个线程上的执行)但语义非常不同的方法起了相同的名字
Control.BeginInvoke
,它将委托作为参数,不需要
EndInvoke
,以及委托自己的
BeginInvoke
方法,正如您所指出的,它需要
EndInvoke
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);
    }
}