FormClosed 事件是否可能多次触发
Is is possible for the FormClosed event to fire more than once
与 FormClosing
事件相反,在用户反复点击关闭按钮的情况下,可以在响应缓慢的应用程序中多次触发该事件。
FormClosed
事件是否可以触发多次?
例如,下面的try/catch
是必要的吗?
private void MyForm_FormClosed(object sender, FormClosedEventArgs e)
{
// Dispose the CancellationTokenSource
// Is it possible for this to be fire more than once!?
try
{
cts.Dispose();
cts = null;
}
catch { }
}
单独调用 cts.Dispose();
绝对没问题,将其设置为 null
是多余的,对垃圾收集器没有帮助,try catch 是 overkill.
A CancellationTokenSource.Dispose
只负责 计时器 和 句柄 内核事件 (ManualResetEvent
),两者都以线程安全的方式清理,并且两个实现都将处理被调用两次并且是容错的。
根据您实例化 CancellationTokenSource
的方式,您还可以使用 null 条件运算符 进行良好测量。
例子
private void MyForm_FormClosed(object sender, FormClosedEventArgs e)
=> cts?.Dispose();
值得注意的是 CancellationTokenSource
检查它之前是否已经被处置过。
protected virtual void Dispose(bool disposing)
{
if (disposing && !_disposed)
{
...
至于Form OnClose
事件是否可以被调用两次,我没有深入研究代码,但我的假设是它会在消息泵,除非您自己调用该事件,否则它只会被调用一次。否则,无论如何,您都会受到保护
嗯,总是可以将同一个事件多次添加到同一个处理程序,在这种情况下它会被调用多次!
但除此之外,我找不到任何保证它只会被调用一次的文档,但查看 WInform 生命周期 https://docs.microsoft.com/en-us/dotnet/desktop/winforms/order-of-events-in-windows-forms?view=netframeworkdesktop-4.8
我会说你可以很确定它应该只被调用一次。
但是,我仍然会采用安全的编码实践并保留 try catch,或者使用 null 条件运算符。
如果你没有捕捉到像这样无害的异常,and/or 有(或稍后添加)一个全局异常处理程序然后它会捕捉并处理这些可能完全不必要的事情并用实际上是垃圾的东西堵塞您的日志文件。 (我经常看到这个)
与 FormClosing
事件相反,在用户反复点击关闭按钮的情况下,可以在响应缓慢的应用程序中多次触发该事件。
FormClosed
事件是否可以触发多次?
例如,下面的try/catch
是必要的吗?
private void MyForm_FormClosed(object sender, FormClosedEventArgs e)
{
// Dispose the CancellationTokenSource
// Is it possible for this to be fire more than once!?
try
{
cts.Dispose();
cts = null;
}
catch { }
}
单独调用 cts.Dispose();
绝对没问题,将其设置为 null
是多余的,对垃圾收集器没有帮助,try catch 是 overkill.
A CancellationTokenSource.Dispose
只负责 计时器 和 句柄 内核事件 (ManualResetEvent
),两者都以线程安全的方式清理,并且两个实现都将处理被调用两次并且是容错的。
根据您实例化 CancellationTokenSource
的方式,您还可以使用 null 条件运算符 进行良好测量。
例子
private void MyForm_FormClosed(object sender, FormClosedEventArgs e)
=> cts?.Dispose();
值得注意的是 CancellationTokenSource
检查它之前是否已经被处置过。
protected virtual void Dispose(bool disposing)
{
if (disposing && !_disposed)
{
...
至于Form OnClose
事件是否可以被调用两次,我没有深入研究代码,但我的假设是它会在消息泵,除非您自己调用该事件,否则它只会被调用一次。否则,无论如何,您都会受到保护
嗯,总是可以将同一个事件多次添加到同一个处理程序,在这种情况下它会被调用多次!
但除此之外,我找不到任何保证它只会被调用一次的文档,但查看 WInform 生命周期 https://docs.microsoft.com/en-us/dotnet/desktop/winforms/order-of-events-in-windows-forms?view=netframeworkdesktop-4.8
我会说你可以很确定它应该只被调用一次。
但是,我仍然会采用安全的编码实践并保留 try catch,或者使用 null 条件运算符。
如果你没有捕捉到像这样无害的异常,and/or 有(或稍后添加)一个全局异常处理程序然后它会捕捉并处理这些可能完全不必要的事情并用实际上是垃圾的东西堵塞您的日志文件。 (我经常看到这个)