在什么情况下,当使用委托和.InvokeRequired
?
例如:
public delegate void DelegateUIUpdate();
private void UIUpdate()
{
if (someControl.InvokeRequired)
{
someControl.Invoke(new DelegateUIUpdate(UIUpdate));
return;
}
// do something with someControl
}
当在循环中或按计时器间隔调用此函数时,程序的句柄会持续增加。
EDIT:
如果将上述注释掉并修改为:
public delegate void DelegateUIUpdate();
private void UIUpdate()
{
//if (someControl.InvokeRequired)
//{
// someControl.Invoke(new DelegateUIUpdate(UIUpdate));
// return;
//}
CheckForIllegalCrossThreadCalls = false;
// do something with someControl
}
...然后是手柄stop递增,但是当然我不想允许跨线程调用。
EDIT 2:
这是显示手柄增加的示例:
Thread thread;
private delegate void UpdateGUI();
bool UpdateTheGui = false;
public Form1()
{
InitializeComponent();
thread = new Thread(new ThreadStart(MyThreadLoop));
thread.Start();
}
private void MyThreadLoop()
{
while (true)
{
Thread.Sleep(500);
if (UpdateTheGui)
{
UpdateTheGui = false;
UpdateTheGuiNow();
}
}
}
private void UpdateTheGuiNow()
{
if (label1.InvokeRequired)
{
label1.Invoke(new UpdateGUI(UpdateTheGuiNow));
return;
}
label1.Text = DateTime.Now.ToString("MM-dd-yyyy HH:mm:ss");
label2.Text = DateTime.Now.ToString("MM-dd-yyyy HH:mm:ss");
label3.Text = DateTime.Now.ToString("MM-dd-yyyy HH:mm:ss");
}
private void btnInvoke_Click(object sender, EventArgs e)
{
UpdateTheGui = true;
}
我也遇到了同样的问题
this.Invoke(new DelegateClockUpdate(ChangeClock), sender, e);
每个调用创建一个句柄。
句柄会递增,因为 Invoke 是同步的,并且句柄实际上已保持挂起状态。
应该使用等待句柄来处理结果,或者使用异步 BeginInvoke 方法,如下所示。
this.BeginInvoke(new DelegateClockUpdate(ChangeClock), sender, e);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)