如何从另一个线程中删除CheckListBox(Windows应用程序)中的项目?

时间:2013-09-30 10:18:57

标签: c# .net multithreading winforms

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

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

1 个答案:

答案 0 :(得分:3)

当您已经在UI线程上时,

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上   与创建控件的线程不同的线程。