我正在开发一个Windows应用程序,我需要在运行时从单独的线程中在清单框中添加项目,因为我使用了:
if (chkLBClientsList.InvokeRequired)
chkLBClientsList.Invoke(new MethodInvoker(delegate{chkLBClientsList.Items.Add(GetHostNameByIpAddress(ipAddress));}));
稍后在应用程序中我需要从清单框中删除项目,为此我使用相同的逻辑:
if (chkLBClientsList.InvokeRequired)
chkLBClientsList.Invoke(new MethodInvoker(delegate { chkLBClientsList.Items.Remove(GetHostNameByIpAddress(GetIpAddress(client))); }));
但是它不起作用....因为这个语句chkLBClientsList.InvokeRequired
返回FALSE值。
请告诉我如何解决这个问题? 提前谢谢。
答案 0 :(得分:3)
Control.InvokeRequired
会返回 false 。试试这个:
delegate method = new MethodInvoker(delegate
{
chkLBClientsList.Items.Remove(GetHostNameByIpAddress(GetIpAddress(client)));
};
if (chkLBClientsList.InvokeRequired)
chkLBClientsList.Invoke(method));
else method();
如果InvokeRequired
false ,只需在不调用的情况下完成工作。
显然,您需要为添加方法执行类似操作。
编辑 - InvokeRequired的MSDN文档可能是您开始的好地方。 http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired.aspx
Control.InvokeRequired Property
获取一个值,该值指示调用者是否必须调用invoke方法 在对控件进行方法调用时,因为调用者在a上 与创建控件的线程不同的线程。