我有以下代码行:
public bool dcpl_radar()
{
if (radar == null)
return false;
else
{
if (radar != null)
{
if (radar.InvokeRequired)
radar.BeginInvoke(new MethodInvoker(delegate()
{
radar.Visible = false;
}));
else
this.radar.Visible = false;
radar = null;
}
return true;
}//end of else statement
}
但是VStudio不断在调用行上抛出错误。我检查了调试器,如果(雷达== null)是真的,但VStudio正在尝试评估它不应该在的部分代码。有人可以解释为什么这样做请?
答案 0 :(得分:4)
等一下......我想我们有竞争条件。 让我们说你BeginInvoke,几乎立即你设置雷达= null。 真的没有人知道你的匿名代表何时会被执行。
我认为这可以解决你的问题。
public bool dcpl_radar()
{
if (radar != null)
{
if (radar.InvokeRequired)
{
radar.BeginInvoke(new MethodInvoker(HideRadar));
}
else
{
HideRadar();
}
return true;
}
return false;
}
private void HideRadar()
{
this.radar.Visible = false;
this.radar = null;
}
答案 1 :(得分:1)
发生了什么:
在将radar
设置为null后,将调用匿名委托。
如何修复
public bool dcpl_radar()
{
if (radar == null)
return false;
else
{
if (radar != null)
{
if (radar.InvokeRequired)
radar.BeginInvoke(new MethodInvoker(delegate()
{
radar.Visible = false;
radar = null;
}));
else {
this.radar.Visible = false;
radar = null;
}
}
return true;
}//end of else statement
}
(注意我已经移动了'null'作业)。
虽然我有点担心将变量设置为null
,但这通常表明设计不合理。