当应用程序收到来自服务的呼叫时,它会为每个呼叫打开一个表单。用户必须在每个窗口中输入并关闭它。为了平滑用户的工作,我正在尝试重新激活用户在显示下一个窗口时正在处理的窗口。
执行此操作的方法如下:
private void ActivatePreviousActiveForm() {
if (_activeWhenOpen != null && _activeWhenOpen.InvokeRequired) {
if (!_activeWhenOpen.Disposing || !_activeWhenOpen.IsDisposed)
_activeWhenOpen.Invoke((MethodInvoker)ActivatePreviousActiveForm);
} else
if (_activeWhenOpen != null && !(_activeWhenOpen is FrmRuntimeError))
_activeWhenOpen.Activate();
}
有时它会在到达行时抛出“”无法访问已处置的对象
if (!_activeWhenOpen.Disposing || !_activeWhenOpen.IsDisposed)
有谁知道为什么会这样?
答案 0 :(得分:4)
尝试反转 if 条件:
这一行
if (!_activeWhenOpen.Disposing || !_activeWhenOpen.IsDisposed)
必须成为
if (!_activeWhenOpen.IsDisposed || !_activeWhenOpen.Disposing)
这是因为条件按照它们的写入顺序进行检查,因此您的代码可能会调用Disposing
对象,这会导致错误。
编辑:
我还认为您应该将 || 更改为&& ,因为如果您的窗口没有处置但处于处置状态,则可能有一个错误。
答案 1 :(得分:1)
您无法访问已处置的对象。为什么要处理?当用户关闭表单时,关闭的默认行为是处理它。为了防止这种情况,你必须覆盖Close方法,因此它只是隐藏表单而不是处理它。像这样:
// Use this event handler for the FormClosing event.
private void YourFormClosing(object sender, FormClosingEventArgs e)
{
this.Hide();
e.Cancel = true; // this will cancel the close event.
}
问候。