1

我正在开发一个 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 值。

请告诉我如何解决这个问题?提前致谢。

4

1 回答 1

3

Control.InvokeRequired当您已经在 UI 线程上时返回false 。尝试这个:

delegate method = new MethodInvoker(delegate
{ 
    chkLBClientsList.Items.Remove(GetHostNameByIpAddress(GetIpAddress(client))); 
};
if (chkLBClientsList.InvokeRequired)
   chkLBClientsList.Invoke(method));
else method();

如果InvokeRequiredfalse,则无需调用即可完成工作。

显然,您需要对Add方法执行类似操作。

编辑 - InvokeRequired 的 MSDN 文档将是您开始的好地方。http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired.aspx

Control.InvokeRequired 属性

获取一个值,该值指示调用者在对控件进行方法调用时是否必须调用调用方法,因为调用者位于与创建控件的线程不同的线程上。

于 2013-09-30T10:22:08.760 回答