C#:内部工作:事件,Control.BeginVoke和程序退出=中断



我正在创建一个包含多个项目的程序,其中一些项目会向主项目消息报告以用于日志记录。

由于我使用的是异步套接字,其中一些消息会在不同的线程中返回,所以一旦它们到达主线程,我就会检查InvokeRequired,如果为true,我就会使用它。BeginInvoke处理日志记录。

我需要在UI线程中处理它,特别是在服务器的情况下,我在ListBox上显示最后记录的消息,这样我就可以在测试期间跟踪操作的进度。

我知道有时可能会发生一些信息被切换的情况,但现在我可以接受。出于某种原因,如果我使用Invoke而不是BeginInvoke,如果我在连接客户端时停止它,服务器将崩溃,甚至不会给出任何异常。但使用BeginInvoke我克服了这一点。

我的问题是理解在程序终止的情况下事件和BeginInvoke是如何工作的。如果某个事件在队列中,或者在程序关闭前调用了BeginInvoke,它会立即终止,取消所有操作吗?还是它会执行所有挂起的操作,在我的情况下,记录挂起的消息,然后退出?

如果要确保执行所有BeginInvoked委托,则必须延迟关闭表单。您可以通过将其设为两步流程,将另一个BeginInvoke委托附加到实际关闭表单的队列中来完成

    private bool closing;
    protected override void OnFormClosing(FormClosingEventArgs e) {
        if (!closing) {
            closing = true;
            // Do your stuff
            //...
            this.BeginInvoke(new Action(() => this.Close()));
            e.Cancel = true;
        }
        base.OnFormClosing(e);
    }

当您调用BeginInvoke来更新UI时,代码将由线程池中的线程执行。如果代码引发异常,它只会终止线程,而不会终止整个应用程序。这就是为什么你看到你的程序没有崩溃。

当刚刚调用BeginInvoke时,程序立即终止。剩余的操作(日志记录)将不会执行,因为线程池中的线程

最新更新